目录
最近在研究ES6新特性时,发现了一个最新引入的数据类型——Symbol
类型。
在我们做大型项目时,难免会遇到使用别人提供的对象,但是往往我们想要加上自己所需要的属性和方法,这时候就可能会产生一个问题:属性或方法名冲突。
Symbol类型有一大特色就是创建的值可以保证是独一无二的,完全避免了属性或方法名冲突的问题发生,这也是ES6引入这个属性的原因。
一、创建Symbol
Symbol()创建 无全局注册
创建Symbol很简单,通过Symbol()
方法就可以了,但需要注意的是,它不是一个类或对象,而是一个原始的值,因此不能new
,也不能添加属性或方法。通过Symbol()创建的值,并没有全局注册
,关于全局注册不能理解的小伙伴先暂且不管,后面自会明白。
let name = Symbol('name');
console.log(name); // Symbol(name)
Symbol.for()创建 全局注册
Symbol.for()在创建值之前,会先在注册的全局环境中进行查找,如果没有注册过,才创建新的值,创建过则返回以前的值并在全局环境中注册。
let name = Symbol.for('name');
console.log(name); // Symbol(name)
二、通过Symbol创建对象属性或方法
let obj = {
name: '小红'
};
let age = Symbol.for('age');
// 第一种方法
obj[age] = 99
// 第二种方法
obj = {
name: '小红',
[age]: 99
}
// 第三种方法
Object.defineProperty(obj, age, {value: 99});
console.log(obj);
Symbol的内置静态方法
在Symbol中一共有Symbol.for(key)
和Symbol.keyFor(symbol)
两种静态方法。
Symbol.for(key)
Symbol.for()
根据给定的键值,去全局Symbol注册环境
中查找对应的Symbol符号,未找到返回新的Symbol并注册,否则返回找到的Symbol符号。
let age1 = Symbol.for('age');
let age2 = Symbol.for('age');
console.log(age1 === age2); // true
let sex1 = Symbol('sex');
let sex2 = Symbol('sex');
console.log(sex1 === sex2); // false
而用Symbol创建的符号,都是一个新符号,所以尽管键值相同,也不是同一个符号。
Symbol.keyFor(symbol)
Symbol.keyFor()
通过符号去找与之对应的键值,但只能是在全局环境中注册之后的符号,才能查询出对应的键值,否则结果为undefined
。
let age = Symbol.for('age');
let sex = Symbol('sex');
console.log(Symbol.keyFor(age)); // age
console.log(Symbol.keyFor(sex)); // undefined