什么是Symbol
ES5中提供了6种数据类型分别是:undefined、null、boolean、string、number、object。ES6中新增了一种数据类型Symbol来表示唯一的值
,每个创建的Symbol都是唯一的,这样在实际运用中可以创建一些唯一的属性及定义私有变量。
如何创建Symbol值:
let a = Symbol();
let b = Symbol();
console.log(a);//Symbol()
console.log(b);//Symbol()
console.log(a==b)//false
我们创建了两个Symbol值,打印发现它们都打印出Symbol()
,难道他们是相等的吗?那么我们打印他们是否相等发现他们并不是相等的。实际上它在内存中是这样的:
也就是说a变量和b变量拿到了各自的内存引用。
如果不借助a变量,你不可能再得到这个地址。因此:
let a = Symbol();
let b = Symbol();
console.log(a);//Symbol()
console.log(b);//Symbol()
console.log(a==b)//false
let c = b;
console.log(c)//Symbol()
console.log(c==b)//true
作用
1、为了防止对象属性名被覆盖,可以通过symbol来定义属性名。
const NAME = Symbol('name')
let obj = {
[NAME]:'张三',
age: 20
}
export default obj;
import obj from './t2.js';
const NAME = Symbol('name');
obj[NAME] = '李四';
console.log(obj);
//{ age: 20, [Symbol(name)]: '张三', [Symbol(name)]: '李四' }
为了区分,可以写成:
import obj from './t2.js';
const NAME = Symbol('name1');
obj[NAME] = '李四';
console.log(obj);
//{ age: 20, [Symbol(name)]: '张三', [Symbol(name1)]: '李四' }
2、利用Symbol作为属性名,属性名不会被Object.keys()、Object.getOwnPropertyNames()、for…in循环返回。
let obj = {
[Symbol()]:'张三',
age: 20,
height:'178com'
}
for(let key in obj){
console.log(key);
}
//age
//height
let keys = Object.keys(obj);
console.log(keys); //输出:[ 'age', 'height' ]
console.log(Object.getOwnPropertyNames(obj)); //输出:[ 'age', 'height' ]
3、可以在类里利用Symbol来定义私有属性及方法。
let People = (function(){
let name = Symbol("name");
class People {
constructor(yourName) { //构造函数
this[name] = yourName
}
sayName() {
console.log(this[name])
}
}
return People;
})();
let zhangsan = new People("张三");
console.log(zhangsan[Symbol("name")]); //undefined
zhangsan.sayName(); //张三
4、Symbol.for()
Symbol提供了一种可以创建相同Symbol的机制,就是使用Symbol.for()方法进行注册。通过该方法生成的Symbol会根据描述符进行全局注册,之后再次通过Symbol.for()传入相同的描述符时,就可以得到相同的Symbol值。
var s1 = Symbol.for('symbol'); //向全局注册了以"symbol"为描述符的Symbol
var s2 = Symbol.for('symbol');
//由于描述符"symbol"已被注册到全局,因此这里创建的Symbol与上面是同一个
console.log(s1 === s2);//true
5、Symbol.keyFor()
如果你想得到一个全局注册的Symbol的描述符,可以使用Symbol.keyFor()方法:
let s1 = Symbol.for("foo");
console.log(Symbol.keyFor(s1)) // "foo"
let s2 = Symbol("foo");
console.log(Symbol.keyFor(s2))//undefined
Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key。变量s2属于未登记的 Symbol 值,所以返回undefined。