function is(a, b) {
return a === b && (a !== 0 || 1 / a === 1 / b) // false for +0 vs -0
|| a !== a && b !== b; // true for NaN vs NaN
}
var arr1 = ["a",NaN,"b"];
var arr2 = ["a",NaN,"b"];
if (arr1.length == arr2.length
&& arr1.every(function(u, i) {
// Use "is" instead of "==="
return is(u, arr2[i]);
})
) {
console.log(true);
} else {
console.log(false);
}
Array.prototype.equals = function (arr) {
return this.length == arr.length && this.every((u, i) => u === arr[i]);
}
console.log([1,2,3].equals([1,2,3])); // true
console.log([1,2,3].equals([1,3,3])); // false
// BUT!
console.log(["a",NaN,"b"].equals(["a",NaN,"b"])); // false, because NaN !== NaN
如果你想让它也适用于NaN,并区分+0和-0,最好使用这个:
Array.prototype.equals = function (arr) {
function is(a, b) { // taken from the top answer
return a === b && (a !== 0 || 1 / a === 1 / b) // false for +0 vs -0
|| a !== a && b !== b; // true for NaN vs NaN
}
return this.length == arr.length && this.every((u, i) => is(u, arr[i]));
}
console.log(["a",NaN,"b"].equals(["a",NaN,"b"])); // true
8条答案
按热度按时间ddarikpa1#
边缘案例的旁注:
===
对于此类任务通常被认为是稍微损坏的,因为NaN
的行为出乎意料:上面的代码实际上记录了
false
,因为NaN !== NaN
。另外,===
不能区分+0
和-0
。为了涵盖这两种情况,你可以使用一个更强大的比较,称为“egal”或“is”,可以很容易地实现如下:rdrgkggo2#
[ES6]
最佳答案是好&足够。
但是,当你只是想比较它的值是相同的,你必须排序它之前。这里没有必要排序代码。
而且..我觉得用“一些”代替“每一个”更好。
如果这些不一样,“一些”会让你提前退出。--很少早,但早;)
ubbxdtey3#
我会使用下划线来表示。
irtuqstp4#
最好的答案是好的,但我也会考虑使用Array.prototype:
如果你想让它也适用于NaN,并区分+0和-0,最好使用这个:
zte4gxcn5#
这是另一个不带ES5
every
的示例:byqmnocz6#
我想添加一些修改的代码所作的'Taihwan Hah',但无法留下评论(系统告诉我这样做)
下面是我的修改:
基本上,我必须检查but数组,因为我的数组不包含唯一的数字。
pbwdgjma7#
(虽然这个问题比v9.0.0老得多,但是)由于这个问题是关于Node的--从Node v9.0.0开始,您可以使用内置的“util”模块的isDeepStrictEqual(arr 1,arr 2)来比较数组(或对象,或任何相关的东西)
也适用于NaN
还有一个非严格的版本:https://nodejs.org/api/assert.html#assertdeepequalactual-expected-message
qyzbxkaa8#
我想稍微改进一下staackuser2的答案:
或