为什么javascript推送数组和定义的数组不相等

时间:2015-07-13 00:59:19

标签: javascript arrays push

我做了以下事情。很困惑他们是否不平等。

var arr1 = []
arr1.push(1)
arr1.push(2)
arr1.push(3)

var arr2 = [1, 2, 3]

var isSame = (arr1==arr2)

为什么isSame是假的?对此非常困惑......

2 个答案:

答案 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以及所有重复项