# Symbol
唯一值,独一无二的值。
let a = Symbol();
let b = Symbol();
console.log(a === b); // false
# 创建Symbol
let firstName = Symbol("firstName");
let person = {};
person[firstName] = "Nicholas";
console.log(person[firstName])
// 注意 如果通过person.firstName = "Nicholas";
// 则是给person中加入一个字符串为 "firstName"的属性
# 识别Symbol
let firstName = Symbol("firstName");
console.log(typeof firstName); // "symbol"
# 通过 [ ] 添加可计算Symbol属性 或 访问Symbol属性
let firstName = Symbol("firstName");
let person = {
[firstName]: "Nicholas"
}
# 使用Symbol.for(description) 创建全局共享的Symbol
let uid = Symbol.for("uid");
let uid2 = Symbol.for("uid");
console.log(uid === uid2); // true
# 枚举Symbol属性
Symbol属性不能被Object.Keys(), Object.getOwnPropertyNames() 枚举
// 只获取Symbol属性
Object.getOwnPropertySymbols(obj);
// 可以获取可枚举的所有属性,包括Symbol属性
Reflect.ownKeys(obj);
# well-known Symbol
暴露语言内部方法
Symbol.hasInstance() 方法
Symbol.isConcatSpreadable
Symbol.iterator 属性
用来定义对象的默认迭代器
let collection = {
*[Symbol.iterator](){
yield 1;
}
// 上面是简写形式
// [Symbol.iterator]: function* () {
// yield 1;
// }
};
for (let item of collection){
console.log(item);
}