JavaScript 数据类型
假定你已经有其他的程序设计语言基础,诸如C++,JAVA等,那么对Int、Char等一定不会陌生。结合ECMA-262[^1]中相关定义,抛开“类型”在静态类型和动态类型语言中的定义的争论,我们暂且认为JavaScript也想其他静态程序设计语言一样,具备如Int一样的数据类型定义,而在稍后的的描述中,你又会看到他们的不一样之处。
截至本文发布,JavaScript一共有以下七种内置类型:
- null (空值)
- undefined (未定义)
- boolean (布尔值)
- number (数字)
- string (字符串值)
- object (对象)
- symbol (符号)
其中除了object(对象以外),其他统称为简单数据类型(基本数据类型)。
null
null 类型只有一个值即null,从计算机存逻辑角度来说,null值表示一个空对象。所以当我们使用typeof
运算符来查看其类型时,会发现返回类型为"object":
事实上,这是JavaScript第一个版本设计时留下的BUG,但因为其改动会破坏现有语言结构,反而会产生更多的BUG,所以便一直留存下来。简单说一下这个BUG出现的原因:在第一个版本中,数值是以32位存储的,由标志位(1~3位)和其他部分组成,标志位和它所对应的类型如下:
- 000:对象,数据是对象的应用。
- 1:整型,数据是31位带符号整数。
- 010:双精度类型,数据是双精度数字。
- 100:字符串,数据是字符串。
- 110:布尔类型,数据是布尔值。
而null的存储是全0,如此一来,当typeof监测标志位的时候发现前三位和对象类型的标志位是完全一致的,所以便有了上图的结果。关于这些类容可以参考这里。
null值一般用于变量初始化或者判断一个已声明变量是否被赋值。但是,当判断一个变量的值是否为null时候应该用下面的复合条件来判断:
//正确做法
var a = null;
(!a && typeof a==="object") //true
//反例
var b=undefined
b==null //true
事实上,null是唯一一个使用typeof运算符后除object类型以外会返回"object"的数据类型。
undefined
Undefined 类型也只有一个值那就是undefined,一般而言,已经申明但未赋值的时候变量的值(javascript)类型即为undefined:
值得注意的是,对未声明(undeclared)的变量执行typeof运算,返回的也是undefined:
但当我们试图使用test时程序运行正常,而anyVar则会抛出异常:
所以这里需要注意的是,变量未定义(not defined/undeclared)和undefined有着严格意义上的区别。假设当typeof 一个没有声明的变量时返回的结果为undeclared,那么我们就不需要这么多废话了[^2]。
boolean
同其他程序设计语言一样,boolean类型只有两个值:true 和 false。
number
number的值包含了所有数字(我们常见的1,2,1.2等),还包含了NA,无穷(正无穷(positive Infinity)和负无穷(negative Infinity)):
由于浮点保存浮点类型所需空间是整数值的两倍,所以浮点型会被转换为整数值,如 var a=1,b=1.000(a===b / true)。对于极大或极小的数,可以用科学计数法(e)表示,一般来说,当小数点以后有六个零或以上时,会被自动转换为e表示的值:
在浮点运算时不要尝试去做比较,老生常谈的一个例子
是因为JavaScript采用了IEEE754浮点计算规则,这当然不只是JavaScript会出现类似情况,IEEE754可以看这里。
处理上述十进制以外,整数还可以通过其他进制来表示:
但应该注意,八进制中当后面的数字超过进制表示范围(0~7)的时候,前导0将会被忽略,后面的数值当作十进制解析。
WU
无论八进制还是十六进制,在进行算数运算时都会被转换成十进制。
string
string是一个有序的、长度有限的包含领个或更多16位无符号的整数列表。
可以这么理解,字符串值是一个二维数组,一个维度表示字符的顺序,一个维度是字符的二进制表达。
这里需要注意的是,和其他设计语言不同,JavaScript的字符串是不可变的,操作string类型的值意味着必然生成一个新的对象(开辟新的存储空间),和C语言的string类型不同,通过相似方法操作字符串会使得两者其实是同一个字符串,即前后的存储空间未发生改变。
object
JavaScript对象其实就是一组数据和功能的集合[^3]。类似Java中的object,JavaScript的object也是所有对象的基础。
[1]:ECMAScript 第九版 (http://www.ecma-international.org/publications/standards/Ecma-262.htm)
[2]: Kyle Simpson《你不知道的JAVASCRIPT(中卷)》
[3]: Nicholas C.Zakas《JavaScript高级程序设计(第三版)》