JavaScript For for循环vs for in不起作用

时间:2015-03-19 20:02:05

标签: javascript for-loop

我写了两个名为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无法获得正确答案?

2 个答案:

答案 0 :(得分:3)

for..in遍历您正在迭代的对象的属性名称

在这种情况下,这些将是012,因此您的尝试是在那些上调用谓词而不是实际的数组元素。

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;
}

docs for for…of

注意:根据文档,这需要一个运行ES6 Harmony提案的实现。