日期:2014-05-16  浏览次数:20384 次

数组foreach的问题
下面是underscore源码对foreach的扩展:

  var each = _.each = _.forEach = function(obj, iterator, context) {
    if (obj == null) return;
//如果原生Array支持的话
    if (nativeForEach && obj.forEach === nativeForEach) {
      obj.forEach(iterator, context);
    } else if (obj.length === +obj.length) {
      for (var i = 0, l = obj.length; i < l; i++) {
        if (iterator.call(context, obj[i], i, obj) === breaker) return;
      }
    } else {
      for (var key in obj) {
        if (_.has(obj, key)) {
          if (iterator.call(context, obj[key], key, obj) === breaker) return;
        }
      }
    }
  };

有两个问题:
1.context参数起什么左右?
2.obj.length === +obj.length是什么意思?
JavaScript

------解决方案--------------------
1.就是将iterator方法劫持给context,等于context也有了iterator方法,如果iterator方法里有this,就是指向context,就是常说的上下文。

2.+obj.length是将字符串转成数字等同于0+obj.length,foreach也可能是一个有length属性的对象,比如{a:1,b:1,length:'2'},这时候obj.length是'2',不是2,一个是字符串一个是数字,所以obj.length === +obj.length为false,则执行最后的else里面的代码,否则为正常数组的话obj.length为2,+obj.length也是2,obj.length === +obj.length为true,则数组遍历。