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]()
打印效果: