Symbol是ES6的新的一种基本数据类型是一种类似于字符串的数据类型
Symbol()函数会返回Symbol类型的值,该类型具有静态属性和静态方法。
每个从Symbol()返回的Symbol值都是唯一的。一个Symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。
其特点:
1、Symbol的值是唯一的,用来解决命名冲突的问题
2、Symbol值不能与其他数据进行运算
3、Symbol定义的对象属性不能使用for..in进行循环遍,但是可以使用Reflect.ownKeys来获取对象的所有键名
特点
不能与其他的数据进行比较以及运算(唯一性)
不能比较
例如:
<script> let a1 = Symbol('11'); let a2 = Symbol('11'); console.log(a1===a2); // flase </script>
效果如下:
如果需要比较即可在后面加上for
<script> let a1 = Symbol('11'); let a2 = Symbol('11'); console.log(a1===a2); //flase let b1 = Symbol.for('22'); //这里加for let b2 = Symbol.for('22'); console.log(b1===b2); //true </script>
效果如下:
不能与其他数据进行运算
例如:
let result = a2 + 100; //报错 let result = a2 > 100; //报错 let result = a1 + a1; //报错
隐藏性,for···in不能访问
例如:
let a = Symbol('Nan'); let obj = { [a]:'Chen' }; console.log(obj); //{Symbol(Nan): "Chen"} for (const option in obj) { console.log(obj[option]); //啥都没有 }
效果:
使用Object.getOwnPropertySymbols方法可以进行访问
<script> let a = Symbol('Nan'); let obj = { [a]:'Chen' }; console.log(obj); for (const option in obj) { console.log(obj[option]); } let array = Object.getOwnPropertySymbols(obj); console.log(array); //[Symbol(Nan)] console.log(obj[array[0]]); //Chen </script>
打印效果:
再看个例子:
let game = { up: 'upp', down: 'doown' } let methods = { up: Symbol(), down: Symbol(), } game[methods.up] = function(){ console.log('up up up') } game[methods.down] = function(){ console.log('down down down') } console.log('game----', game) game[methods.up]()
打印效果: