我做了以下事情。很困惑他们是否不平等。
var arr1 = []
arr1.push(1)
arr1.push(2)
arr1.push(3)
var arr2 = [1, 2, 3]
var isSame = (arr1==arr2)
为什么isSame
是假的?对此非常困惑......
答案 0 :(得分:1)
根据经验,请避免使用==
,因为它受制于复杂的强制规则。 ===
更简单,更有效,并且通常不易出错。 JavaScript中的===
运算符,对于数组和对象,通过引用进行比较 - 如果两个变量引用同一个对象,则只返回true。
var a = [1,2,3];
var b = [1,2,3];
var c = a;
console.log(a === b); // false
console.log(a === a); // true
console.log(a === c); // true
对于数字,bool和字符串,===
运算符按值进行比较。
var a = "hi";
var b = "hey";
var c = "hi";
console.log(a === b); // false
console.log(a === c); // true
如果要按值比较两个数值数组,最好的方法是创建一个特别适用于此的函数:
function arrayEquals(a,b){
for (var i=0, l=a.length; i<l; ++i)
if (a[i] !== b[i])
return false;
return true;
}
这仅在您的数组仅包含本机值 - 字符串,数字和布尔值时才有效。如果你想比较一个更深层的结构,快速而肮脏的方法是将它序列化为JSON并比较:
var a = [[1,2],3,4];
var b = [[1,2],3,4];
var c = [[1,5],3,4];
console.log(JSON.stringify(a) === JSON.stringify(b)); // true
console.log(JSON.stringify(a) === JSON.stringify(c)); // false
这适用于任何有效JSON的结构,并且对于常规操作实际上是可接受的,因为JSON.stringify通常是本机实现的。所以, tl; dr:在比较之前,只需在数组上使用JSON.stringify。
答案 1 :(得分:1)
比较变量时,您只会比较变量本身而不是它们的内容。
字符串,数字以及布尔值都是简单类型。他们总是代表他们的价值。
对象不同。如果比较对象,则只检查对象引用是否等于第二个比较器的对象引用。
通过比较对象,您永远不会比较它们包含的变量。 对象只是更多变量的容器。 变量可以是简单类型也可以是对象。
你只是比较两个基础来确定它们是否完全相同。
如果你真的想要将数组的内容与另一个数组的内容进行比较,你需要递归检查它包含的每个变量。
一个例子..
var obj = {};
obj.foo = "bar";
(function (o) {
o.foo = "baz";
})(obj);
console.log(o.foo); // will print "baz"
使用数组进行操作时,您将获得相同的结果。
你可能想看看这个问题:Deep comparison of objects/arrays以及所有重复项