JavaScript For loop vs for in 不起作用

JavaScript For loop vs for in does not work

我编写了两个名为 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不能得出正确答案?

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

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

Don't use for..in with arrays。无法保证迭代顺序,它可能会迭代非索引属性。

如果您不想使用传统的 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 提案的实现。