【问题标题】:JavaScript For loop vs for in does not workJavaScript For 循环与 for in 不起作用
【发布时间】:2015-03-19 20:02:04
【问题描述】:

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

【问题讨论】:

标签: javascript for-loop


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多