簡體   English   中英

underscore.js every()with undefined

[英]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.

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