看了很多关于 JavaScript 基本数据类型和引用数据类型的说明,真的是众说纷纭,有的其中还存在一些错误的描述,感觉不容易理清楚,因此想对其做一个总结。
JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据。
数据类型
最新的 ECMAScript 标准定义了 7 种数据类型:
- 6 种原始类型(或者叫做基本类型):- Boolean
- Null
- Undefined
- Number
- String
- Symbol(ES 6 新增)
 
- 1 种引用类型:- Object
 
基本数据类型
除 Object 之外的所有类型,它们的值都是不可变的。例如:JavaScript 中对字符串的操作,是返回了一个新的字符串,而原字符串并没有被改变。
这些类型的值,被称为“原始值”。
Boolean 类型
在计算机科学中,布尔值是一种取值仅能为 真 或 假 的数据类型,它赋予了编程语言在逻辑上表达真 或 假 的能力。
布尔表示一个逻辑实体,可以有两个值:true 和 false。
Null 类型
Null 类型只有一个值: null。
值 null 特指对象的值未设置。
值 null 是一个字面量。 null 是表示缺少的标识,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解。在 APIs 中, null 常在返回类型是对象,但没关联值的地方使用。
| 1 | // foo不存在,它从来没有被定义过或者是初始化过: | 
Undefined 类型
一个没有被赋值的变量会有个默认值 undefined。全局属性 undefined 表示原始值 undefined。
undefined 是全局对象的一个属性。也就是说,它是全局作用域的一个变量。undefined 的最初值就是原始数据类型 undefined 。
自 ECMAscript5 标准以来 undefined 是一个不能被配置(non-configurable),不能被重写(non-writable)的属性。即便事实并非如此,也要避免去重写它。
一个没有被赋值的变量的类型是 undefined。
一个函数如果没有使用 return 语句指定返回值,就会返回一个 undefined 值。
严格相等操作符
可以使用严格相等操作符 === 来判断一个变量是否拥有值。
| 1 | var x; | 
注意: 不能用标准相等操作符
==来判断,因为当值为null时,null == undefined的结果为true。但是null不同于undefined。
typeof 操作符
也可以使用 typeof 操作符,对变量进行判断。1
2
3
4var x;
if(typeof x === 'undefined') {
    // 执行这些语句
}
使用 typeof 可以避免在变量没有声明时抛出错误。1
2
3
4
5
6
7
8// 这里没有声明y
if(typeof y === 'undefined') {       // 没有错误,执行结果为true
   console.log("y is " + typeof y )  // y is undefined
}
if(y === undefined) {                // ReferenceError: y is not defined
}
void 操作符
还可以使用 void 操作符。
void expression 对给定的表达式进行求值,然后返回 undefined。
void 运算符通常只用于获取 undefined 的原始值,一般使用void(0)(等同于void 0)。
| 1 | var x; | 
Number 类型
根据 ECMAScript 标准,JavaScript 中只有一种数字类型:
基于 IEEE 754 标准的双精度 64 位二进制格式的值,即:$-(2^{63} - 1)$ 到 $2^{63} - 1$。
JavaScript 中,并没有为整数设置一个特定的类型(如其他语言中常见的 int)。
除了能够表示浮点数之外,还能表示一些带符号的值:
- +Infinity
- -Infinity
- NaN(非数值,Not-a-Number)
String 类型
JavaScript 的字符串类型用于表示文本数据。它是一组 16 位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。
这里不做过多描述。
Symbol 类型
符号是 ECMAScript 第 6 版新定义的。符号类型是唯一的并且是不可修改的, 并且也可以用来作为 Object 的 key 的值。
要了解详细使用场景和方法,可以参考ECMAScript 6 入门 - Symbol。
引用类型
对象
在 Javascript 里,对象可以被看作是一组属性的集合。
一个 Javascript 对象就是键和值之间的映射.。键是一个字符串(或者 Symbol) ,值可以是任意类型的值。
函数是一个附带可被调用功能的常规对象。
数组是一种使用整数作为键(integer-key-ed)属性和长度(length)属性之间关联的常规对象。
类型数组(Typed Arrays)是ECMAScript Edition 6中新定义的 JavaScript 内建对象,提供了一个基本的二进制数据缓冲区的类数组视图。
JavaScript 有一个内置对象的标准库。请查看参考来了解更多对象。
涉及 Object 的具体细节过多,不是本文重点,不做描述。
typeof 操作符与数据类型
虽说 JavaScript 有 7 种数据类型,而 typeof 操作符的功能是返回一个未经计算的操作数的类型的字符串值。
但是 typeof 的返回值还是与我们预料的有些差别,我们来看一下:
| 类型 | 结果 | 
|---|---|
| Undefined | “undefined” | 
| Null | “object” | 
| Boolean | “boolean” | 
| Number | “number” | 
| String | “string” | 
| Symbol | “symbol” | 
| 宿主对象(由 JS 环境提供) | Implementation-dependent | 
| 函数对象 | “function” | 
| 任何其他对象 | “object” | 
其中,最值得注意的是:typeof null 的结果为 "object",要说为什么,只能说是历史遗留的问题。
在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null 就错误的返回了"object"。
ECMAScript提出了一个修复(通过opt-in),但被拒绝了。
因此,我们记住这点就好,typeof null 的结果为 "object"。
代码示例:
| 1 | // Numbers | 
总结
JavaScript 中目前一共有 7 种数据类型,Boolean,Null,Undefined,Number,String,Symbol(ES 6 新增) 和 Object。
其中基本数据类型一共有 6 种,分别是 Boolean,Null,Undefined,Number,String 和 Symbol。
而常见的诸如函数(function),数组(array)等,都是属于对象,Object 类型。