Javascript Symbol.prototype比较错误
为什么会出现此错误:Javascript Symbol.prototype比较错误,javascript,Javascript,为什么会出现此错误: Uncaught TypeError: Symbol.prototype [ @@toPrimitive ] requires that 'this' be a Symbol 我什么时候运行这个代码 3 == Symbol.prototype 我仍在试图自己找出原因,目前为止,我使用一个try catch块按住它一段时间,但我想知道错误的原因。因为执行=(邋遢)比较尝试使用@@toPrimitive将符号转换为原语值,但这仅适用于符号类型和符号。原语不是符号类型,而是对
Uncaught TypeError: Symbol.prototype [ @@toPrimitive ] requires that 'this' be a Symbol
我什么时候运行这个代码
3 == Symbol.prototype
我仍在试图自己找出原因,目前为止,我使用一个
try catch
块按住它一段时间,但我想知道错误的原因。因为执行=
(邋遢)比较尝试使用@@toPrimitive
将符号转换为原语值,但这仅适用于符号类型和符号。原语
不是符号类型,而是对象类型
例如,可以这样做,调用Symbol()
创建一个具有符号类型的新值,因此可以使用@@toPrimitive
将其转换为原语值
console.log(Symbol()==3)代码>3==Symbol。原型执行以下操作(可能已知的部分保持简短):
- 尝试将
Symbol.prototype
作为参数调用ToPrimitive
来强制将Symbol.prototype
设置为Symbol.prototype
,然后将其作为参数使用。这是由于执行强制操作,并且第一个操作数是一个数字
Symbol.prototype[@@toPrimitive]
依次调用。在这里,您可以开始注意问题,此
不是符号
thisSymbolValue
被指定为在此
既不是符号也不是带有[[SymbolData]]的对象时抛出类型错误(无进一步详细信息,例如,您还会在chrome和FF[1]上收到不同的消息)
[1] 在我的FF 60.0.1上尝试比较基元(3
)和对象(Symbol.prototype
)时,“TypeError:[Symbol.toPrimitive]方法在不兼容对象上调用了该方法”,如下所示:
让obj={
[Symbol.toPrimitive](){
console.log(“@@toPrimitive被调用!”);
}
}
console.log(0==obj)
为什么要首先运行此代码?它是为我的个人项目运行的。我想在这种情况下创建对象原型及其所有属性的备份:String.prototype.toLowerCase=null;“你好,世界!”。toLowerCase()/*错误*/
。因此,原型及其属性的备份将消除此问题String.prototype.toLowerCase=null;BackedUpStringPrototype.toLowerCase.call(“你好,世界!”)/“你好,世界!”代码>…假设Function.prototype.call
没有出错,我明白了。但是它仍然不能解释为什么你要用==
将符号.prototype
与一个数字进行比较。这是我调试项目时测试的一部分,我注意到了这个错误,这在当时对我来说是很新的。好吧,这不是代码中的实际问题,而是当你遇到它时让你好奇的事情?使用==
应该比使用try
/catch
更好地解决问题。