你不知道的JavaScript(一)数据类型
ECMAScript 规范地址:
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
有过WEB前端开发经验的朋友都知道JavaScript是一种弱类型的语言,定义变量时无需指定变量类型,任一类型的值都可以赋值给该变量。正确的理解每一种数据类型,在适当的时候进行类型转换对我们编程是很有帮助的。
例如我们有一个多于两位的整数,抛开位数不管,我们要获取从左到右数第二位数字,这时候將整数转换为string是比较方便的。
var num = 1234566;
var strNum = num + "";
alert(strNum[1]);//值为2
这样的例子很多,笔者不做过多介绍。JavaScript总共定义了七种内置类型,分别如下:
- null
- undefined
- boolean
- number
- string
- object
- symbol—ECMAScript 6.0规范新增
接下来我们使用typeof操作符,来检查给定的值属于哪种类型,typeof操作符会返回该值的类型字符串。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>exam_2</title>
</head>
<body>
<div>
<script type="text/javascript">
document.writeln(typeof "hello world!");
document.writeln("<br/>");
document.writeln(typeof 123.1);
document.writeln("<br/>");
document.writeln(typeof Symbol());
document.writeln("<br/>");
document.writeln(typeof [1,2,3]);
document.writeln("<br/>");
document.writeln(typeof {name:"Rongbo_J",age:23});
document.writeln("<br/>");
document.writeln(typeof /^[1-9]$/);
document.writeln("<br/>");
document.writeln(typeof true);
document.writeln("<br/>");
document.writeln(typeof undefined);
document.writeln("<br/>");
</script>
</div>
</body>
</html>
在浏览器中运行可以看到输出的类型字符串:
JS中的字符串属于string类型,数值(不区分整数和浮点数)都属于number类型,symbol类型为ECMAScript6.0规范新增,通过Symbol()调用产生。数组、对象、正则表达式都属于object类型,ture/false两个值属于boolean类型。undefined表示变量值未指定或变量未声明,单独属于一个类型undefined。
此外这里有一些特例:
document.writeln(typeof null);//输出object
null和undefined类似,一个值作为一个类型,我们使用typeof null 应该返回”null”字符串才对,那这里为什么会返回”object”呢?
你可能不知道其实这是JavaScript最初设计上的一个Bug,有很多已经存在的WEB系统都使用类似下面的代码来检测null值:
var a = null;
if(!a && typeof a == "object"){};
如果修复了这个bug,将会导致现存的WEB系统出现更多的Bug,所以这个bug一直持续了近20年,而且以后也不可能会修复。
再来看一个例子:
var func = function(){
};
document.writeln(typeof func);//页面输出function
document.writeln("<br/>");
这里我们定义一个函数,使用typeof操作符获取类型字符串,页面输出function。读者可能很容易认为function也是JS顶层的内置类型。实际上ECMAScript规范中提到,function类型属于object的”子类型”。
为了证明这个结论,我们可以这样写代码:
<script type="text/javascript">
alert(function(){}.length);
</script>
可以看到,语法上没有任何问题:
最后再来谈谈typeof操作符,下面这段代码再常见不过了:
var a = 20;
typeof a;
一些书籍中说typeof操作符用来获取变量的类型,其实这种说法不是很准确,JavaScript的变量是没有类型这个概念的,类型是和变量的值相关的。
上面的代码实际上等价于:
typeof 20;
准确的描述应该是:typeof操作符用来获取变量的值的类型。
你不知道的JavaScript(一)数据类型的更多相关文章
- javascript 之数据类型
写在前面 国庆整理资料时,发现刚开始入门前端时学习JS 的资料,打算以一个基础入门博客记录下来,有不写不对的多多指教: 先推荐些书籍给需要的童鞋 <JavaScript 高级程序设计.pdf&g ...
- javascript 之数据类型--01
写在前面 国庆整理资料时,发现刚开始入门前端时学习JS 的资料,打算以一个基础入门博客记录下来,有不写不对的多多指教: 先推荐些书籍给需要的童鞋 <JavaScript 高级程序设计.pdf&g ...
- 十分钟快速了解《你不知道的 JavaScript》(上卷)
最近刚刚看完了<你不知道的 JavaScript>上卷,对 JavaScript 有了更进一步的了解. <你不知道的 JavaScript>上卷由两部分组成,第一部分是< ...
- 《你不知道的JavaScript》整理(二)——this
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...
- 《你不知道的JavaScript》整理(一)——作用域、提升与闭包
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...
- 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域
你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...
- JS-安全检测JavaScript基本数据类型和内置对象的方法
前言:在前端开发中经常会需要用到检测变量数据类型的需求,比如:判断一个变量是否为undefined或者null来进行下一步的操作,今天在阅读“编写高质量代码-改善JavaScript程序的188个建议 ...
- JavaScript基础——数据类型
JavaScript使用数据类型来确定如何处理被分配给一个变量的数据.变量的类型决定了你可以对变量进行什么操作,如循环或者执行.下面描述了最常用的变量类型. 字符串(String):此数据类型将字符数 ...
- JavaScript 的数据类型 相关知识点
(1)基本数据类型介绍 JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type) 或者说是:可以拥有方法的类型和不能拥有方法的类型 或者说是 ...
- JavaScript的数据类型
JavaScript的数据类型 1.JavaScript的数据类型包括:字符串.数值.布尔.数组.对象.Null.Undefined. 2.JavaScript拥有动态类型,这以为着同一个变量可用作不 ...
随机推荐
- maven、spring jdbc与mysql、mybatis
以它们之前的一个简单用例作为实例. 一个简单的能跑起来的实例.原文网址.非常好的例子. http://www.open-open.com/lib/view/open1390534380648.html ...
- SQL Server 查询所有包含某文本的存储过程、视图、函数
• 方法一:查询所有包含某文本的存储过程.视图.函数 SELECT * from sysobjects o, syscomments s where o.id = s.id AND text LIK ...
- ES6的基本语法
ES6 详细参考页面 简介 ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现.一般来说,这两个词是可以互换的. let命令 ES6新增了let命令,用来声明变 ...
- nginx 与 Windows 错误
设置根目录 root "D:/www/app"; proxy_pass 反向代理 404 location php 模块添加 fastcgi_split_path_info ^(( ...
- vue 父子组件通信props/emit
props 1.父组件传递数据给子组件 父组件: <parent> <child :childMsg="msg"></child>//这里必须要 ...
- 腾讯测试工程师:你以为会打LOL就能做测试了?
周日参加完公司团建,回家路上拼到一个IT界的老司机,他和几个朋友组件团队承接开发项目,知道我是做测试的,问了我一个问题: “你们大公司的测试都做什么?” “测试应该不好模仿吧?” 刚开始我也不清楚他的 ...
- python简单的购物系统
#coding = utf-8 #2016-11-19#我的工资是存在文件中的,执行后会判断是否存过工资,如果存过无需输入,直接购物,没存过需要输入工资#wages.txt是存工资的文件 import ...
- javscript中变量的作用域和提升
示例: var a = 1; function foo() { if (!a) { var a = 10; } alert(a); }; foo(); 上面这段代码在运行时会产生 ...
- Windows10 下安装 Mongodb
一.先登录Mongodb官网https://www.mongodb.com/download-center#community 下载 安装包.32.64位的都行.
- linux防火墙查看状态firewall、iptable
一.iptables防火墙1.基本操作 # 查看防火墙状态 service iptables status # 停止防火墙 service iptables stop # 启动防火墙 service ...