电子商务网站建设实验报告,做流量的网站,室内设计联盟首页,创新设计ES5的对象属性名都是字符串#xff0c;这容易造成属性名的冲突。比如#xff0c;你使用了一个他人提供的对象#xff0c;但又想为这个对象添加新的方法#xff08;mixin 模式#xff09;#xff0c;新方法的名字就有可能与现有方法产生冲突。如果有一种机制#xff0c;保… ES5的对象属性名都是字符串这容易造成属性名的冲突。比如你使用了一个他人提供的对象但又想为这个对象添加新的方法mixin 模式新方法的名字就有可能与现有方法产生冲突。如果有一种机制保证每个属性的名字都是独一无二的就好了这样就从根本上防止属性名的冲突。这就是 ES6 引入 Symbol 的原因。ES6引入了一种新的原始数据类型Symbol表示独一无二的值。它是 JavaScript 语言的第七种数据类型前六种是 undefined 、 null 、布尔值Boolean、字符串String、数值Number、对象Object。 主要特性
唯一性每个通过 Symbol() 创建的符号都是唯一的。不可变性Symbol 值是不可变的不能被更改。原始类型Symbol 是一种原始类型不是对象。全局Symbol注册表所有创建的Symbol都会被注册到全局Symbol注册表中以确保它们的唯一性。作为属性键Symbol 常用作对象属性的键可以避免属性名冲突。内置SymbolES6 定义了一些内置的 Symbol如 Symbol.iterator。
用法
创建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 property2. Symbol作为属性键
let uniqueKey Symbol();let obj {[uniqueKey]: This property key is unique
};console.log(obj[uniqueKey]); // 输出This property key is unique3内置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
}Symbol使用注意事项
Symbol 值不能被隐式地转为字符串或数字如果需要进行转换可以使用 String() 函数或 Number() 函数。Symbol 作为属性键时不能使用点操作符访问必须使用方括号 []。由于 Symbol 的唯一性它常用于防止属性名冲突实现私有属性的效果。