我用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?,这个问题不会用字符串来处理比较案例!
答案 0 :(得分:2)
==
运算符表示与转化相等。
当与两种不同类型一起使用时,一个(或两个)将被强制转换为通用类型以进行比较。这就是前两个测试用例(array == string)所发生的情况。
<强> From MDN: 强>
平等(==)
等于运算符转换操作数(如果是) 不是同一类型,然后应用严格的比较。如果两个操作数 是对象,然后JavaScript比较内部引用 当操作数引用内存中的同一个对象时,它是相等的。
因此,当比较两个对象(数组是对象)时,它们已经是相同的类型,因此将对象引用与另一个进行比较。对于对象,它不是被比较的数据,它是内存中的实际对象,因此比较两个变量以查看它们是否指向相同的内存位置,在您的情况下,它们不会。
答案 1 :(得分:0)
即使materials_1
和materials_2
包含相同的string
值,它们实际上是两个不同的Arrays
。当你比较它们时,你实际上在比较引用,这就是为什么类似的东西总是false
,无论数组的内容如何。
同样适用于[] == []
。每个[]
创建一个新的空数组,然后比较对它们的引用。
但是,当您将它们与materials_3
(string
(使用==
)进行比较时,JS会调用valueOf()
其他数组将它们转换为原始值。由于valueOf()
返回的值也不是原语,它会在其上调用toString()
,返回"Hydrogen,Helium,Lithium"
。由于字符串是基元,现在比较将按值完成并返回true
。
您可以在MDN上找到有关valueOf()
的更多信息:
JavaScript调用
valueOf
方法将对象转换为原始值。您很少需要自己调用valueOf
方法;当遇到期望原始值的对象时,JavaScript会自动调用它。默认情况下,来自
Object
的每个对象都会继承valueOf
方法。每个内置核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,valueOf
将返回对象本身。
你可以在这里看到:
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;
答案 2 :(得分:0)
当使用==运算符且至少有一个操作数是原始的时,Javascript会尝试将比较下的变量转换为相同的类似类型。 Reference
所以在你的情况下,
案例1: materials_1 == materials_3被处理为material_1.toString()== materials_3(结果证明是真的)
案例2:与案例1相同
情况3:这两个操作数都是相同的类型(即数组)。由于基于引用来比较对象,它们显然会有不同的内存位置,因此它们不相等。