上一篇文章了解了一下可迭代对象这个概念
这个可迭代对象上有一个[Symbol.iterator] 的方法,迭代发生的时候,这个方法会返回一个迭代器,再通过迭代器得到每次迭代的值
内置 Symbol 值
这就遇到了这个 Symbol.iterator
它是一个内置的 Symbol 值(Symbol 的静态属性)。内置的 Symbol 会描述一些内部的语言行为,比如上面提到的对象的迭代行为
除了这个 Symbol.iterator,JS 里有很多的内置 Symbol 值
Symbol.hasInstance
// Symbol.hasInstance 决定了 instanceof 操作的行为
// const result = myInstance instanceof myConstructor;
// 使用 instanceof 时,JS 引擎会检查右侧的构造函数(myConstructor),是否有 Symbol.hasInstance 属性,如果有则(myInstance 作为参数)调用它并返回结果
// 没有的话,则检查对象(myInstance)的原型链是否存在构造函数的 prototype 属性
function MyConstructor() {}
const myInstance = new MyConstructor();
console.log(MyConstructor[Symbol.hasInstance](myInstance)); // true
console.log(MyConstructor[Symbol.hasInstance]); // [Function: [Symbol.hasInstance]]
console.log(myInstance instanceof MyConstructor); // true
Symbol.toPrimitive
// Symbol.toPrimitive 决定了一个对象转换为原始值时的行为
// 如果对象有这个方法,则调用。没有的话,则尝试调用 valueOf() 和 toString()
const obj = {
[Symbol.toPrimitive](hint) {
console.log(hint);
if (hint === "number") {
return 123;
}
if (hint === "string") {
return "str";
}
return true;
},
};
console.log(2 * obj); // hint: number; log: 246
console.log("" + obj); // hint: default; log: true
console.log(String(obj)); // hint: string; log: str
更多的内置 Symbol 可参考:developer.mozilla.org/zh-CN/docs/…
这些属性以 Symbol 的形式出现让这些语言特征变得“标准化”,开发者能够以更为一致地方式去定义自己的逻辑(比如:自定义对象的迭代行为)。同时,得益于 Symbol 的唯一性,这些属性也不会在全局发生冲突