簡體   English   中英

數組中的未定義條目在通過`every`解析為布爾值后返回`true`。

[英]Undefined entries in an array return `true` after parsing them as boolean with `every`

為了跟蹤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];

forEachforEach MDN

forEach對數組中存在的每個元素以升序執行一次提供的回調。 對於已刪除或消除的索引 不會調用它。 但是,它針對存在的且具有值undefined的元素執行。

我強烈懷疑every對象也都以這種方式循環播放,盡管我正在搜索規格。

因此,當[true,,true]調用every ,只有[true,true] (例如)被傳遞,因為忽略了第二個元素。 但是請考慮以下

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

上面的語句返回false因為它實際上包含undefined ,而不僅僅是undefined結果,這是當我們嘗試使用尚未設置的索引訪問數組元素時得到的結果。

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

摘要:

布爾(或指定的回調)僅針對存在的實際值調用,而不會導致產生虛假值( undefined )的實際值調用,因為它們首先不存在。

ECMAScript語言規范-ECMA-262版本5.1也建議相同

這是array.every的工作方式:

  • 對於分配了值的每個數組元素,都會調用該回調,而對於已刪除或從未分配過的索引,則不會調用該回調(例如,您的Array(3))

  • 如果回調返回假值,它將返回假。 因為您沒有分配值,所以永遠不會調用布爾值。

試試吧

[false,false,false].every(function(value) {
  console.info(arguments); 
  return true;
});

vs.(無控制台輸出)

Array(3).every(function(value) {
  console.info(arguments); 
  return true;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM