![](/img/trans.png)
[英]Return true if a object is set to undefined in an array of objects
[英]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];
在forEach
上forEach
MDN
forEach對數組中存在的每個元素以升序執行一次提供的回調。 對於已刪除或消除的索引, 不會調用它。 但是,它針對存在的且具有值undefined的元素執行。
我強烈懷疑every
對象也都以這種方式循環播放,盡管我正在搜索規格。
因此,當[true,,true]
調用every
,只有[true,true]
(例如)被傳遞,因為忽略了第二個元素。 但是請考慮以下
[true,undefined,true].every(Boolean) // false
上面的語句返回false
因為它實際上包含值undefined
,而不僅僅是undefined
結果,這是當我們嘗試使用尚未設置的索引訪問數組元素時得到的結果。
在我們的例子中, [true,,true]
值在0和2索引中,但沒有在1中
布爾(或指定的回調)僅針對存在的實際值調用,而不會導致產生虛假值( undefined
)的實際值調用,因為它們首先不存在。
這是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.