JavaScript在对象和字符串之间的松散比较

时间:2015-10-14 03:22:50

标签: javascript internet-explorer-8

以下代码,

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}"
}

cstring,不认为这在这里真的很重要)

1 个答案:

答案 0 :(得分:3)

执行someObject == "someString"后,Abstract Equality Comparison Algorithm执行此操作:

  
      
  1. 如果Type x )是对象且Type y )是字符串或数字,则返回比较结果{ {3}}( x )==   ý
  2.   

使用对象调用ToPrimitive时,

  

返回Object的默认值。对象的默认值   通过调用[[DefaultValue]]的内部方法来检索   对象,传递可选提示 PreferredType 。的行为   [[DefaultValue]]内部方法由本规范定义   对于ToPrimitive

中的所有本机ECMAScript对象

总结一下,当在没有提示的非Date本机对象上调用8.12.8.时,它会执行以下操作:

  1. 如果对象具有返回基元的toString方法,则默认值为原始
  2. 如果对象具有返回基元的valueOf方法,则默认值为原始
  3. 抛出TypeError
  4. 我的猜测是有些代码修改了[[DefaultValue]]Object.prototype.toString,现在他们可能会在ToPrimitive调用时抛出。