- ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
- Symbol值通过
Symbol
函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。 - 注意,
Symbol
函数前不能使用new
命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。也就是说,由于Symbol值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
Symbol
函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
- 由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。Symbol值作为对象属性名时,不能用点运算符。在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号之中。
1 // Symbol: es6新增数据类型,表示独一无二的值 2 // 解决问题: 如果添加的对象属性名重复,解决属性名重复 3 var obj = { name: 'xixi', age: 13, name: 'dfs' } 4 console.log(obj) // {age: 13, name: 'dfs'} 5 6 //声明的方式 7 let s = Symbol() 8 let s1 = Symbol() 9 console.log(s == s1) //false 10 11 let s2 = Symbol('s2') // 's2' 参数表示描述信息, 没啥用 12 13 // 实际运用 14 var id = Symbol() 15 var obj1 = { id: 1, [id]: 100 } // 该对象重复定义id时, 16 console.log(obj1) //{id: 1, Symbol(): 100}, 相当于改对象有两个id属性 17 console.log(obj1[id]) // 100 只能通过中括号形式来获取,不能使用扩展运算符... 18 //注意 在我们使用 for in 或者 Object.keys 来获取属性是,是不能获取到 Symbol添加的这个属性的 19 for (var i in obj1) { 20 console.log(i) //id, 21 } 22 console.log(Object.keys(obj1)) // id