在 ECMAScript6 规范中,JavaScript中有
6种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number、Symbol和String;
1种复杂数据类型(也称为引用数据类型)——Object,Object本质上是由一组无序的名值对组成的。
下面详细介绍一下这 7 种数据类型的一些特性:
1. Undefined
该类型只有一个值,即 undefined。 undefined 意为 未定义
,即当使用 var 声明了变量但未进行复制时,这个变量的值就是 undefined。undefined 产生的原因有两种:
- 访问对象不存在的属性或方法
- 声明了变量但从未赋值
1 | var v1,obj = {}; |
2. Null
Null 类型也只有一个值:null , 表示一个变量中没有包含有效数据。null 在这里意为空值
、空对象
的意思,更确切的说,一个被赋值为 null 的变量没有保存有效的数值、字符串、布尔、数组或对象等,可以通过给一个变量赋值为 null 来清空变量中的内容。产生 null 的原因只有一个:即对一个变量显式的赋值为 null 。
1 | var p = null; |
从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值会返回 “object” 的原因,但实际上是 JavaScript 最初实现的一个BUG,后来被ECMAScript沿用下来了,详情参考 The history of typeof null
另外,undefined 值也是派生自 null 值的, 因此 ECMA-262 规定对他们的相等测试要返回 true:
1 | undefined == null; //true |
3. Boolean
Boolean类型只有两个字面值:true 和 false 。 但在 JavaScript 中,所有类型的值都可以转化为与 Boolean 等价的值,转化规则如下:
- 所有对象都被当作 true,
- 当字符串为空时,该字符串被当作 false
- null 和 undefined 被当作 false
- 当数字为 0 时,该数字被当作 false
1 | typeof true; // "boolean" |
需要注意的是,平时我们看到的if(1) {…} ,实际上JS 引擎在内部也对这些值做了 Boolean 转化然后再进行运算的。
4. Number
在 Javascript 中,没有 int 和 float 数据类型,而是用 Number 来表示整数和浮点数值,除此之外,Number 还有一个特殊的数值,即NaN (Not a Number),NaN表示一个承诺返回数值类型数据但实际没有返回的情况。NaN有两个特点:一是任何涉及NaN的操作都会返回NaN,二是NaN不与任何数值相等,包括自己,
但可以通过 isNaN() 方法来判断一个数值是否为 NaN :
1 | typeof 123; // "number" |
5. Symbol
Symbol 是 ES6 新增的一种原始数据类型,表示独一无二的值,Symbol 值通过函数生成,如下所示:
1 | let s = Symbol(); //s是独一无二的值 |
6. String
String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。JavaScript 的字符串类型用于表示文本数据。它是一组16位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。
不同于类 C 语言,JavaScript 字符串是不可更改的。这意味着字符串一旦被创建,就不能被修改。但是,可以基于对原始字符串的操作来创建新的字符串。例如:
- 获取一个字符串的子串可通过选择个别字母或者使用 String.substr().
- 两个字符串的连接使用连接操作符 (+) 或者 String.concat().
在 JavaScript 中,字符串是基本数据类型,本身不存任何操作方法,为了方便的对字符串进行操作,ECMAScript 提供了一个基本包装类型:String 。它是一种特殊的引用类型,每当读取一个字符串的时候,JS内部就会创建一个对应的 String 对象,这样就可以直接调用 String 上的方法来操作字符串 。
1 | var s1 = "some text"; |
当第二行代码访问 s1 时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问字符串时,JS内部会自动完成下列处理:
- 创建 String 类型的一个实例
- 在实例上调用指定的方法
- 销毁这个实例
用伪代码模拟以上三个步骤:
1 | //创建 s1 的包装对象 |
从中可以看出,基本包装类型 和 引用类型 有一个很重要的区别,即对象的生存期
不同 。使用 new 操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。在 JavaScript 中,类似的基本包装类型还有 Number、Boolean 等。
7. Object
除过上面的 6 种基本数据类型外,剩下的就是引用类型了,统称为 Object 类型。细分的话,包括有:Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型 等,这些对象在JS中都属于引用类型,除 Function 之外,通过 typeof 检测其数据类型返回的都是 object,如果要判断对应的具体类型,则可以通过 Object.prototype.toString 来获取。
1 | var a = {}; |