JavaScript松散比较对象和字符串

JavaScript loose comparison between an object and a string

本文关键字:字符串 对象 比较 JavaScript      更新时间:2023-09-26

下面的代码,

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,不认为这里真的很重要)

当您执行someObject == "someString"时,抽象相等比较算法会这样做:

  • 如果Type(x)是Object, Type(y)是String或Number,返回topprimitive (x) ==的比较结果
  • 当使用对象调用topprimitive时,

    返回对象的默认值。对象的默认值的内部方法[[DefaultValue]]检索对象,传递可选提示PreferredType。的行为[[DefaultValue]]内部方法由本规范定义8.12.8中所有原生ECMAScript对象。

    总结一下,当[[DefaultValue]]在一个非date原生对象上被调用而没有提示时,它会这样做:

    1. 如果对象有一个返回原语的toString方法,默认值是原语
    2. 如果对象有一个返回原语的valueOf方法,默认值是原语
    3. 扔TypeError

    我的猜测是一些代码修改了Object.prototype.toStringObject.prototype.valueOf,现在它们在被topprimitive调用时可能会抛出