JS:奇怪的对象比较行为

时间:2018-06-22 18:05:07

标签: javascript object variables comparison

给出以下代码:

const name = { name: 'amy' };

function greet(person) {
    if (person == { name: 'amy' }) {
        return 'hey amy';
    } else {
        return 'hey there';
    }
}

console.log(
    greet(name)  // 'hey amy'
);

console.log(
    greet({ name:'amy' })  // 'hey there'
);

console.log(name == { name: 'amy' });  // true

console.log(name === { name: 'amy' });  // false

console.log(Object.is(name, { name: 'amy' }));  // false

为什么使用true变量而不是对象文字时双精度比较返回name

首先,我认为可能是因为对象具有相同的内存地址,但正如人们看到的那样,这不是事实。

此外,如果我们颠倒过来并在函数内部定义变量,则比较将返回false! (代码中未显示,但您可以签出)

我很困惑,不胜感激。

编辑: Here是我测试代码的地方。 Chrome中的Nodejs和浏览器控制台为我提供了常规结果,应该是这样。所以也许是关于口译员的事。

2 个答案:

答案 0 :(得分:0)

您认为在脑海中Javascript将与==进行比较,但事实并非如此。但是由于这是一个自定义对象,所以您不能指望Javascript会为您提供自定义实现。您应该自己实现它。

唯一可行的情况是,使用===运算符检查对象是否相同但按其内存地址,从而跳过任何custom-object-data-based比较。

答案 1 :(得分:0)

这里的问题是变量name的使用。

在浏览器中,window对象具有一个name属性,该属性必须始终为字符串。如果您尝试为其分配非字符串的内容,它将被转换为一个。

然后,当您将一个对象与字符串进行比较时,该对象也将被转换并比较两个字符串。这就是为什么您看到它有时返回true的原因。示例:

// This will end up being assigned to window.name, and will be converted to a string.
var name = {name: "amy"}
console.log(name) // [object Object]

// Then, when you compare that to another object using ==, the object will also be converted to string.
console.log(name == {name: "amy"}) // true, because the string [object Object] is equal to itself.

将变量的名称更改为其他名称,或者使用letconst,问题应该消失:

// This will end up being assigned to window.other, but isn't converted to string
var other = {name: "amy"}
console.log(other) // {"name": "amy"}

// Now, both are objects, and unless they are the exact same object, comparing two objects is always false.
console.log(other == {name: "amy"}) // false, no two distinct objects are ever equal

// Using let will not assign this variable to window.
let name = {name: "amy"}
console.log(name) // {"name": "amy"}

// Again, now we compare two distict objects, which always results in false.
console.log(name == {name: "amy"}) // false