写在前面: ES6中对象的属性名都是字符串,容易造成重名,污染环境。
Symbol 的特点:
- Symbol 属性的值时唯一的,解决命名冲突问题
- Symbol 值不能与其他数据进行计算,包括字符串拼接
- for in, for of 不会遍历 Symbol 属性
注意:Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
Symbol 的使用
- 调用Symbol函数得到symbol值
let symbol = Symbol();
let obj = {};
obj[symbol] = 'hello';
- 传参标识
let symbol = Symbol('one');
let symbol2 = Symbol('two');
console.log(symbol);// Symbol('one')
console.log(symbol2);// Symbol('two')
- 内置Symbol值
- 除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
- Symbol.iterator 迭代器的使用
- 对象的Symbol.iterator属性
// 当使用 for...of 去遍历某个数据结构的时候,首先去找 Symbol.iterator 接口
// 若 找到了就去遍历,否则返回 TypeErr: xxx is not iterator
const data = {
name: 'Tom',
age: 18,
length: 2,
[Symbol.iterator]: function() {
let nextIndex = 0
return {
next: function() {
return nextIndex < this.length ? {
value: this[nextIndex++],
done: false
} :
{
value: undefined,
done: true
}
}
}
}
}
参考资料:
网友评论