以下代码,
var someObject = {"attr":1}; // line:1
alert(someObject == "someString"); //line:2
失败,但第2行中有unexpected call to method or property access
例外。
当我将比较更改为strict
等于时,它可以正常工作。
alert(someObject === "someString");
我理解进行strict
比较不会执行type conversion
,但无法确定在类型转换发生时该错误究竟发生在什么时候。
注意:确切的对象有大约十个属性,每个属性都有一个显着长度的字符串值。
我能够重现此错误的最小输入:
someObject = {
"a":"RESOLVED",
"b":"A-1444779652190",
"c":"{s=Hello, id=A-1444779652190}"
}
(c
是string
,不认为这在这里真的很重要)
答案 0 :(得分:3)
执行someObject == "someString"
后,Abstract Equality Comparison Algorithm执行此操作:
使用对象调用ToPrimitive时,
返回Object的默认值。对象的默认值 通过调用[[DefaultValue]]的内部方法来检索 对象,传递可选提示 PreferredType 。的行为 [[DefaultValue]]内部方法由本规范定义 对于ToPrimitive
中的所有本机ECMAScript对象
总结一下,当在没有提示的非Date本机对象上调用8.12.8.时,它会执行以下操作:
toString
方法,则默认值为原始valueOf
方法,则默认值为原始我的猜测是有些代码修改了[[DefaultValue]]或Object.prototype.toString
,现在他们可能会在ToPrimitive调用时抛出。