es6新增的基本数据类型:1、Symbol类型,表示独一无二的值,即Symbol实例是唯一、不可变的;它的产生是因为要用来唯一的标记,进而用作非字符串形式的对象属性,是确保对象属性使用唯一标识符,不会发生属性冲突的危险。2、BigInt类型,提供对任意长度整数的支持,主要是为了表达大于“2^53-1”的整数。
前端(vue)入门到精通课程:进入学习
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API调试工具:点击使用
本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。
基本数据类型
也称为原始数据类型,包括String、Number、Boolean、undefined、null、Symbol、BigInt,其中Symbol
和BigInt
为ES6新增。
Symbol 类型
Symbol 是 ECMAScript6 中引入的一种新的数据类型,表示独一无二的值。Symbol 是原始值(基础数据类型),且 Symbol 实例是唯一、不可变的。它的产生是因为要用来唯一的标记,进而用作非字符串形式的对象属性,是确保对象属性使用唯一标识符,不会发生属性冲突的危险。
在 ES6 之前,对象的键只能是字符串类型,但是这样有个问题,就是会造成键名命名冲突,后者覆盖前者,这个时候就需要一个唯一值来充当键名,Symbol 横空出世。
1、概念
symbol 是一种基本数据类型,Symbol()函数会返回 symbol 类型的值,该类型具有静态属性和静态方法。但是它不是构造函数,不能用 new Symbol()来创建。
let symbol = Symbol(); typeof symbol; // "symbol"
Symbol 作为对象属性时,当在对象内部时,必须要用方括号括起来,不用方括号括起来代表的是字符串。
let s = Symbol(); let obj = { [s]: "Jack", }; obj[s]; // "Jack" obj.s; // undefined
而且当要取该属性的值时,不能用点运算符,因为点运算符后面同样是字符串类型。
创建 Symbol 数据类型时,都是 Symbol()这么创建的,当打印出来时,都为 Symbol(),这样很难区别各个 Symbol 类型的变量是什么意思。所以在 Symbol 函数内可以接收一个字符串的参数,表示该定义 Symbol 类型变量的描述。
let s1 = Symbol("a"); console.log(s1); // Symbol(a) s1.toString(); // "Symbol(a)"
如果 Symbol 类型接收的一个对象类型的话,那就会先调用其内部的 toString 方法,将其变为一个字符串,然后才生成一个 Symbol 值。
let arr = [1, 2, 3]; let s1 = Symbol(arr); console.log(s1); // Symbol(1,2,3) let obj = { toString: () => "abc", }; let s2 = Symbol(obj); console.log(s2); // Symbol(abc)
Symbol 类型的变量是不能和其他变量参与运算的,而且其只能转为 String 类型和 Boolean 类型。
let s = Symbol(); console.log("1" + s); // TypeError: Cannot convert a Symbol value to a string s.toString(); // "Symbol()" Boolean(s); // true Number(s); // TypeError: Cannot convert a Symbol value to a number
2、Symbol.prototype.description
当给 Symbol 添加描述时,可以通过 Symbol.prototype.description 来获取该描述。
let s = Symbol("Jack"); s.description; // 'Jack'
3、Symbol.for(key)和 Symbol.keyFor(sym)
最开始看到这两个方法时,我以为是两个遍历的方法。
-
Symbol.for(key):使用给定的 key 搜索现有的 symbol,如果找到则返回该 symbol。否则将使用给定的 key 在全局 symbol 注册表中创建一个新的 symbol。
-
Symbol.keyFor(sym):从全局 symbol 注册表中,为给定的 symbol 检索一个 key。
let s1 = Symbol.for("foo"); let s2 = Symbol.for("foo"); s1 === s2; // true
Symbol.for 会搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。所以由其创建的两个相同描述的值会相等。这种创建就和普通的 Symbol()有着截然不同的结果了:
let s1 = Symbol("foo"); let s2 = Symbol("foo"); s1 === s2; // false
因为不管怎样 Symbol()返回的都是一个全新的值,换句话说 Symbol()生成的值没有注册在全局中,所以返回的值都是全新的,而 Symbol.for()会在先在全局中查找,有就返回这个值,没有则创建新的值,但新的值也是挂载在全局中的。
Symbol.keyFor(sym)是在全局中查找是否有该 Symbol 值,有则返回该描述。
let s1 = Symbol.for("Jack"); Symbol.keyFor(s1); // 'Jack' let s2 = Symbol("Rose"); Symbol.keyFor(s2); // undefined
因为 s2 没有挂载在全局中,所以 Symbol.keyFor()找不到它,故返回 undefined。
4、内置的 Symbol 属性
除了定义自己使用的 Symbol 值以外,ES6 还提供了 13(有可能今后会