javascript - 数组中的未定义条目在使用 `true` 将它们解析为 boolean 值后返回 `every`

标签 javascript arrays boolean undefined

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

var processingDone = Array(3);

然后,我将 boolean 值设置为正确的索引(伪代码):

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

我想出了一个简单的方法来检查是否所有的 boolean 值都为真,就是使用every,就像这样:

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

现在,出于某种原因,如果不是所有的 boolean 值都被设置,但是设置的所有 boolean 值都是true每个 code> 返回 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 executes the provided callback once for each element present in the array in ascending order. It is not invoked for indexes that have been deleted or elided. However, it is executed for elements that are present and have the value undefined.

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

因此,当 [true,,true] 调用 every 时,只有 [true,true](say) 作为第二个元素被忽略。但是请考虑以下内容

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

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

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

总结:

boolean 值(或指定的回调)只为存在的实际值调用,而不为那些导致值(未定义)的值调用,因为它们没有存在于第一位。

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

关于javascript - 数组中的未定义条目在使用 `true` 将它们解析为 boolean 值后返回 `every`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27941288/

相关文章:

java - "for (int clickableId : clickableIds)"有什么作用?

list - F#:递归函数:测试元素是否是给定列表的成员

Python - 确定井字游戏的赢家

javascript - 防止全局范围的污染

javascript - Photoshop CC Javascript - 删除/剪切选区

javascript - 为什么这个代码是有效的?

php - 按品牌显示包含产品信息的关联数组

arrays - PostgreSQL v9.X 有真正的 "array of record"吗?

比较已定义和 undefined variable

javascript - 重定向 URL JavaScript