数组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,则数组遍历。