ES6 全新特性 Symbol类型详解

最近在研究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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值