[英]underscore.js every() with undefined
我寫了一些像這樣的代碼:
var a = new Array(10); // should be [undefined * 10]
var b = _.every(a, function(m){
if(_.isUndefined(m)){
return false;
}
return true;
});
我希望b是'假',但它返回'true'。 為什么它會回歸“真實”?
然后,我改為:
var c = [undefined, undefined];
var d = _.every(c, function(m){
if(_.isUndefined(m)){
return false;
}
return true;
});
它在d中返回'false'。
為什么他們不同?
你可以在http://jsfiddle.net/3qj4B/3/上測試一下
在使用Array構造函數初始化數組和初始大小之間存在細微差別,並使用undefined
條目的顯式列表進行初始化。 前者(Array構造函數)不會創建與索引對應的屬性,而顯式初始化則會創建。
我懷疑.forEach()
在可能的情況下使用原生.forEach()
,並且不會為未初始化的索引調用它的回調。 因此,在第一個測試中,永遠不會調用_.every()
的回調。
編輯 - Array構造函數執行的操作或多或少與:
var a = []; a.length = 10;
當你通過增加它的長度來擴展數組時,新的隱式索引位置不會被初始化。 它是不存在屬性和存在沒有價值的屬性之間的基本區別。 在這兩種情況下,對屬性的取消引用都會導致undefined
。 從而:
var o = {};
if (o.something == undefined) // this will be true
接着:
var o = { something: undefined };
if (o.something == undefined) // also true
告訴兩種情況之間的差異的一個方法是in
運營商:
if ('something' in o) // only true in the second case
使用類初始化程序創建數組時,您將創建一個可以使用10個可用內存空間的數組,但它們都尚未初始化。 所以你沒有循環任何東西。
現在看看every
的來源:
_.every = _.all = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = true;
if (obj == null) return result;
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
each(obj, function(value, index, list) {
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
});
return !!result;
};
result
被設置為true
並且返回它,因為each
都沒有迭代。 這就是你回歸true
的原因。
如果,在你的小提琴中,你試圖在處理程序中添加一個console.log(m)
,你將看不到控制台中的日志,因為each
迭代0次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.