<分区>
我做了以下事情。很困惑他们是否不相等。
var arr1 = []
arr1.push(1)
arr1.push(2)
arr1.push(3)
var arr2 = [1, 2, 3]
var isSame = (arr1==arr2)
为什么 isSame
为假?对此很困惑...
标签 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 在循环内将数组中的所有项目相乘
javascript - iframe 中的 Window.top 和 top.document
c++ - 如何在Matlab中保存多维矩阵的二进制并将其加载为C++结构?
objective-c - Urban Airship - 使用 NSURLConnection 发送推送
javascript - CasperJS 中是否有任何 onResourceTimeout 等效项?