【Symbol 静态属性】和日常代码关系还挺密切

73 阅读1分钟

WX20240816-150336@2x.png

上一篇文章了解了一下可迭代对象这个概念

这个可迭代对象上有一个[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 的唯一性,这些属性也不会在全局发生冲突