我写了两个名为some和every的函数,希望得到如下所示的结果:
console.log(every([NaN, NaN, NaN], isNaN));
// → true
console.log(every([NaN, NaN, 4], isNaN));
// → false
console.log(some([NaN, 3, 4], isNaN));
// → true
console.log(some([2, 3, 4], isNaN));
// → false
我的职能是:
function every(array,predicate){
for (var element in array){
if (!predicate(element))
return false;
}
return true;
}
function some(array, predicate){
for (var element in array){
if (predicate(element))
return true;
}
return false;
}
但结果都是false
将for...in
更改为for
循环后,答案是正确的。
function every(array, predicate) {
for (var i = 0; i < array.length; i++) {
if (!predicate(array[i]))
return false;
}
return true;
}
function some(array, predicate) {
for (var i = 0; i < array.length; i++) {
if (predicate(array[i]))
return true;
}
return false;
}
为什么for..in
无法获得正确答案?
答案 0 :(得分:3)
for..in
遍历您正在迭代的对象的属性名称。
在这种情况下,这些将是0
,1
,2
,因此您的尝试是在那些上调用谓词而不是实际的数组元素。
Don't use for..in
with arrays。迭代的顺序无法保证,它可以最终迭代非索引属性。
答案 1 :(得分:0)
如果您不想使用传统的for
循环,请考虑使用for…of
循环,该循环遍历数组中的元素。 for…in
遍历密钥。
function every (array, predicate) {
for (var element of array) {
if (!predicate(element)) {
return false;
}
}
return true;
}
注意:根据文档,这需要一个运行ES6 Harmony提案的实现。