为了跟踪3个布尔值,我决定使用一个简单的数组:

var processingDone = Array(3);


然后,我将布尔值设置为适当的索引(伪代码):

function stepTwoDone(){
    processingDone[1] = true;
}


我想出一种简单的方法来检查其中的所有布尔值是否都正确,那就是使用every,如下所示:

if(processingDone.every(Boolean)){
    // Do stuff
}


现在,由于某种原因,如果没有设置所有的布尔值,但是设置的所有布尔值都是true,则every返回true



alert('Array(3): '     + Array(3).every(Boolean) + '\n' +         // true
      '[,,]: '         + [,,].every(Boolean) + '\n' +             // true
      '[true,,true]: ' + [true,,true].every(Boolean) + '\n' +     // true
      '[,false,]: '    + [,false,].every(Boolean) + '\n' +        // false
      'All true: '     + [true,true,true].every(Boolean) + '\n' + // true
      'All false: '    + [false,false,false].every(Boolean));     // false







那么,这是怎么回事?
当传递给Boolean构造函数时,为什么数组中的未定义值看起来等于真实值?如预期的那样,简单地调用不带参数的Boolean()返回false



当然,简单的解决方案是首先将值设置为伪造:

var processingDone = [false, false, false];

最佳答案

forEach上的MDN


  forEach为每个存在的元素执行一次提供的回调
  在数组中按升序排列。不会为以下索引调用它
  已被删除或消除。但是,对于
  存在并且具有未定义的值。


我强烈怀疑也以这种方式循环播放,尽管我正在搜索规范。

因此,当every调用[true,,true]时,只有every(例如)被传递,因为忽略了第二个元素。但是请考虑以下

[true,undefined,true].every(Boolean) // false


上面的代码返回[true,true],因为它实际上包含值false,而不仅仅是undefined的结果,这是我们尝试访问尚未设置索引的数组元素时得到的结果。

在我们的例子中,undefined的值在0和2索引中,但没有在1中

摘要:

布尔(或指定的回调)仅针对存在的实际值调用,而不针对那些导致错误值([true,,true])的实际值调用,因为它们首先不存在。

ECMAScript Language Specification - ECMA-262 Edition 5.1 also suggests the same

09-20 23:25