Symbol.prototype 比较错误

Lap*_*pys 5 javascript

为什么我会收到此错误:

Uncaught TypeError: Symbol.prototype [ @@toPrimitive ] requires that 'this' be a Symbol
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时?

3 == Symbol.prototype
Run Code Online (Sandbox Code Playgroud)

我仍在尝试自己找出原因,到目前为止使用一个try-catch块来按住它一段时间,但我想要一个错误的原因。

Mat*_*ava 1

因为执行==(草率)比较尝试使用转换Symbol.prototype为原始值@@toPrimitive,但这仅适用于符号类型和Symbol.prototype不是符号类型,而是具有对象类型。

例如,您可以执行此操作,调用Symbol()创建一个具有符号类型的新值,因此可以使用 转换为其原始值@@toPrimitive

console.log(Symbol() == 3);
Run Code Online (Sandbox Code Playgroud)

或者使用===代替==(通过使用严格相等,JS引擎不会尝试转换Symbol.prototype为其原始值)

console.log(Symbol.prototype === 3);
Run Code Online (Sandbox Code Playgroud)

甚至使用它与其他对象进行比较==(也不会尝试将 symbol.prototype 转换为其原始值)

console.log(Symbol.prototype == {});
Run Code Online (Sandbox Code Playgroud)

但是整个测试是毫无意义的,因为你无法真正改变Symbol.prototype,所以它永远不会等于3,因此你可以简单地将比较代码替换为false

做这样的事情Symbol.prototype = 3;永远不会起作用,因为它Symbol.prototype是函数的只读属性Symbol,它是浏览器本机代码的一部分。