Equality object-String在JavaScript中使用==

时间:2018-05-06 12:30:45

标签: javascript arrays object equality

我用Javascript处理奇怪的情况,

我知道JS的奇怪时刻(像这样)并不奇怪,只是代码完全可预测且完全符合规定。



var materials_1 = ['Hydrogen', 'Helium', 'Lithium'];
var materials_2 = ['Hydrogen', 'Helium', 'Lithium'];
var materials_3 = "Hydrogen,Helium,Lithium";

console.log(materials_1 == materials_3); //True
console.log(materials_2 == materials_3); //True
console.log(materials_1 == materials_2); //False

console.log([] == []);  //False




但是,在这种平等比较中使用==时,有人可以给我一个详细的解释吗?

谢谢你的光明。

注意:我已经检查了How to compare arrays in JavaScript?,这个问题不会用字符串来处理比较案例!

3 个答案:

答案 0 :(得分:2)

==运算符表示与转化相等。

当与两种不同类型一起使用时,一个(或两个)将被强制转换为通用类型以进行比较。这就是前两个测试用例(array == string)所发生的情况。

<强> From MDN:

  

平等(==)

     

等于运算符转换操作数(如果是)   不是同一类型,然后应用严格的比较。如果两个操作数   是对象,然后JavaScript比较内部引用   当操作数引用内存中的同一个对象时,它是相等的。

因此,当比较两个对象(数组是对象)时,它们已经是相同的类型,因此将对象引用与另一个进行比较。对于对象,它不是被比较的数据,它是内存中的实际对象,因此比较两个变量以查看它们是否指向相同的内存位置,在您的情况下,它们不会。

答案 1 :(得分:0)

即使materials_1materials_2包含相同的string值,它们实际上是两个不同的Arrays。当你比较它们时,你实际上在比较引用,这就是为什么类似的东西总是false,无论数组的内容如何。

同样适用于[] == []。每个[]创建一个新的空数组,然后比较对它们的引用。

但是,当您将它们与materials_3string (使用==进行比较时,JS会调用valueOf()其他数组将它们转换为原始值。由于valueOf()返回的值也不是原语,它会在其上调用toString(),返回"Hydrogen,Helium,Lithium"。由于字符串是基元,现在比较将按值完成并返回true

您可以在MDN上找到有关valueOf()的更多信息:

  

JavaScript调用valueOf方法将对象转换为原始值。您很少需要自己调用valueOf方法;当遇到期望原始值的对象时,JavaScript会自动调用它。

     

默认情况下,来自Object的每个对象都会继承valueOf方法。每个内置核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,valueOf将返回对象本身。

你可以在这里看到:

&#13;
&#13;
function ObjectWrapper(actualObject) {
  this.actualObject = actualObject || {};
}

ObjectWrapper.prototype.valueOf = function() {
  console.log('valueOf');
  
  return this.actualObject; // Not a primitive.
};

ObjectWrapper.prototype.toString = function() {
  console.log('toString');
  
  return this.actualObject.toString();
};

const foo = new ObjectWrapper([1, 2, 3]);
const bar = '1,2,3';

console.log(foo == bar);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

当使用==运算符且至少有一个操作数是原始的时,Javascript会尝试将比较下的变量转换为相同的类似类型。 Reference

所以在你的情况下,

案例1: materials_1 == materials_3被处理为material_1.toString()== materials_3(结果证明是真的)

案例2:与案例1相同

情况3:这两个操作数都是相同的类型(即数组)。由于基于引用来比较对象,它们显然会有不同的内存位置,因此它们不相等。