1

次のようなコードを書きました。

var a = new Array(10); // should be [undefined * 10] 
var b = _.every(a, function(m){
    if(_.isUndefined(m)){
        return false;
    }
    return true;
});

b が「false」であることを期待していますが、「true」を返します。なぜ「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/でテストできます

4

2 に答える 2

2

クラス初期化子を使用して配列を作成すると、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

フィドルでハンドラー内に追加しようとすると、0回反復console.log(m)するため、コンソールにログが表示されません。each

于 2013-10-10T14:14:07.760 に答える