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

标签 javascript arrays push

<分区>

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

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

var arr2 = [1, 2, 3]

var isSame = (arr1==arr2)

为什么 isSame 为假?对此很困惑...

最佳答案

根据经验,避免使用 == 因为它受制于复杂的强制转换规则。 === 通常更简单、更高效且更不容易出错。对于数组和对象,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;
}

这仅在您的数组仅包含 native 值(字符串、数字和 bool 值)时才有效。如果你想比较更深层次的结构,一种快速而肮脏的方法是将它序列化为 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 通常是 native 实现的。所以,tl;dr:只需在比较之前对数组使用 JSON.stringify。

关于javascript - 为什么javascript推送数组和定义数组不相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374113/

相关文章:

javascript - 为什么此 HTTP 请求返回数组长度而不是内容?

javascript - 如何使用 JavaScript 在循环内将数组中的所有项目相乘

Java 服务器到服务器接口(interface)

javascript - iframe 中的 Window.top 和 top.document

c++ - 如何在Matlab中保存多维矩阵的二进制并将其加载为C++结构?

javascript同时将两个数组的元素压入一个数组

objective-c - Urban Airship - 使用 NSURLConnection 发送推送

javascript - CasperJS 中是否有任何 onResourceTimeout 等效项?

javascript - 防止浏览器的后退按钮重新打开上一页的弹出窗口

javascript - 使用纯 JS 或 jQuery 使用 Alt-Tab 检测浏览器页面窗口何时失去焦点