赞
踩
- ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入 Symbol 的原因。
- ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是: undefined 、 null 、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
创建Symbol:使用 Symbol() 创建一个新的 Symbol 值。
作为属性键:使用 Symbol 作为对象属性的键,确保属性的唯一性。
内置Symbol:使用 ES6 内置的 Symbol,如 Symbol.iterator 来实现自定义迭代器。
1. 创建和使用Symbol
let mySymbol = Symbol('mySymbol');
let object = {
[mySymbol]: 'This is a unique property'
};
console.log(object[mySymbol]); // 输出:This is a unique property
2. Symbol作为属性键
let uniqueKey = Symbol();
let obj = {
[uniqueKey]: 'This property key is unique'
};
console.log(obj[uniqueKey]); // 输出:This property key is unique
3:内置Symbol Symbol.iterator
let myIterable = {
[Symbol.iterator]: function* () {
yield 1;
yield 2;
yield 3;
}
};
[...myIterable]; // 使用扩展运算符和Symbol.iterator进行迭代
// 输出:[1, 2, 3]
4. Symbol的不可变性和唯一性
let sym1 = Symbol('sym1');
let sym2 = Symbol('sym1');
console.log(sym1 === sym2); // 输出:false,证明Symbol是唯一的
// 尝试修改Symbol的描述
try {
sym1.description = 'New description';
} catch (e) {
console.error(e); // Symbol属性是不可变的,这将抛出错误
}
5. 使用Symbol避免属性名冲突
let obj = {
id: '123',
[Symbol('key')]: 'secret'
};
console.log(obj.id); // 输出:123
console.log(obj[Symbol('key')]); // 输出:secret
// 其他代码无法通过猜测 'key' 属性名来访问 'secret' 属性
6. 使用Symbol检查属性
let mySymbol = Symbol('mySymbol');
let obj = {[mySymbol]: 'This is unique'};
if (mySymbol in obj) {
console.log('Property exists'); // 输出:Property exists
}
// 检查属性是否存在于对象的自身属性中,不包括原型链
if (Object.hasOwnProperty.call(obj, mySymbol)) {
console.log('Property is own property'); // 输出:Property is own property
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。