JavaScript中使用==的相等对象字符串

JavaScript中使用==的相等对象字符串,javascript,arrays,object,equality,Javascript,Arrays,Object,Equality,我在用Javascript处理一个奇怪的情况 我知道JS的奇怪时刻(像这样)一点也不奇怪,只是代码完全可以预测并且完全按照指定的方式工作 var材料_1=['氢'、'氦'、'锂']; var材料_2=[‘氢’、‘氦’、‘锂’]; var materials_3=“氢、氦、锂”; console.log(materials_1==materials_3)//真的 console.log(materials_2==materials_3)//真的 console.log(materials_1==

我在用Javascript处理一个奇怪的情况

我知道JS的奇怪时刻(像这样)一点也不奇怪,只是代码完全可以预测并且完全按照指定的方式工作

var材料_1=['氢'、'氦'、'锂'];
var材料_2=[‘氢’、‘氦’、‘锂’];
var materials_3=“氢、氦、锂”;
console.log(materials_1==materials_3)//真的
console.log(materials_2==materials_3)//真的
console.log(materials_1==materials_2)//假的

console.log([]=[])//False
=
运算符表示与转换相等。

当与两种不同的类型一起使用时,其中一种(或两者)将被强制为公共类型,以便执行比较。这就是前两个测试用例(array==string)的情况

相等(=)

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


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

即使
materials\u 1
materials\u 2
包含相同的
字符串值,它们实际上是两个不同的
数组。当比较它们时,实际上是在比较引用,这就是为什么这样的东西总是
false
,而不管数组的内容如何

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

但是,当您将它们与
材质\u 3
(使用
=
)比较时,JS将调用其他数组将它们转换为原始值。由于从
valueOf()
返回的值也不是原语,因此它将调用
toString()
,返回
“氢、氦、锂”
。由于字符串是原语,现在将按值进行比较,并返回
true

您可以在MDN上找到更多信息:

JavaScript调用
valueOf
方法将对象转换为原语值。您很少需要自己调用
valueOf
方法;JavaScript在遇到需要原语值的对象时自动调用它

默认情况下,
valueOf
方法由其派生的每个对象继承。每个内置核心对象都会重写此方法以返回适当的值。如果对象没有基元值,
valueOf
返回对象本身

你可以在这里看到:

函数对象包装器(actualObject){
this.actualObject=actualObject | |{};
}
ObjectWrapper.prototype.valueOf=函数(){
console.log('valueOf');
返回this.actualObject;//不是原语。
};
ObjectWrapper.prototype.toString=函数(){
console.log('toString');
返回这个.actualObject.toString();
};
const foo=新的ObjectWrapper([1,2,3]);
常数条='1,2,3';

log(foo==bar)当使用==运算符且至少有一个操作数是基元时,Javascript尝试将比较中的两个变量转换为相同的相似类型。

所以在你的情况下

案例1: materials_1==materials_3作为materials_1处理。toString()==materials_3(结果是真的)

案例2:与案例1相同


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

还有@MohammadUsman,我已经检查了这个问题!我的问题是更面向对象的字符串,没有比较运算符!Javascript尝试转换比较中的两个对象否,对象未转换,只有原语才转换。如果仅转换原语,问题中的案例1和案例2不应返回true-对吗?我的意思是,当比较对象和对象时,您的语句不正确(您编写了两个对象)。如果它是一个object==原语,那么只有一个object.Oops!我的错。谢谢你纠正我。