什么能够被迭代

在 ES5 中,只能对数组对象进行迭代,而 underscore 提供的迭代方法,除了支持 array, 还支持 object 的迭代, 对 object 迭代的依据是对象的键序列 keys,我们可以查看 underscore 中的 _.each 方法:

_.each = _.forEach = function (obj, iteratee, context) {
    // 首先要优化回调过程
    iteratee = optimizeCb(iteratee, context);
    var i, length;
    // 区分数组和对象的迭代过程
    if (isArrayLike(obj)) {
        for (i = 0, length = obj.length; i < length; i++) {
            // 数组的迭代回调传入三个参数(迭代值, 迭代索引, 迭代对象)
            iteratee(obj[i], i, obj);
        }
    } else {
        var keys = _.keys(obj);
        for (i = 0, length = keys.length; i < length; i++) {
            // 对象的迭代回调传入三个参数(迭代值, 迭代的key, 迭代对象)
            iteratee(obj[keys[i]], keys[i], obj);
        }
    }
    // 返回对象自身, 以便进行链式构造
    return obj;
};

可以看到,array 是直接迭代数组的每个元素,而 object 迭代的元素是对象的每个 k-v 对。看一下用例:

var obj = {
  name: 'wxj',
  age: 13,
  sex: 'male'
};

_.each(obj, function(value, key, obj){
  console.log('['+key+'] is:', value);
});

// name's value is: wxj
// ...
// ...

results matching ""

    No results matching ""