为了跟踪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