很糟糕。
不要$(associative_array).each(function () {...})——那是nonsense
不要$.each(associative_array, function() {...}); -- 有一个不起眼的bug(1)
要查看错误,请在 javascript 控制台中尝试:
> $.each({foo:1, length:-1, bar:2}, console.log)
foo 1
length -1
bar 2
> $.each({foo:1, length:0, bar:2}, console.log)
第一个示例输出三行键值对,这是它应该的。第二个什么都不输出!
故事的寓意,不要在对象上使用 jQuery.each()。 (JavaScript 中的对象是 essentially 和 same thing 作为关联数组。)事情可能永远正常工作,但你冒着有一天对象碰巧有一个名为 length 的成员的风险,它的值恰好是 @987654333 @ 然后你有一个不知从何而来的错误,很难解释。 (我会让你猜测,这个答案的分量很重,这是否发生在我身上。)
如bug report中提到的:
如果您需要遍历具有长度属性的对象的所有键,jQuery.each 不是正确的解决方案。
我建议更进一步,永远不要依赖 jQuery.each 来处理关联数组。
(1) 这个“错误”可能永远无法修复,因为 $.each() 历史上在数组上使用Duck Typing:“具有长度属性的数组和类似数组的对象(例如函数的参数对象) ) 由数字索引迭代。"
这就是我使用[thanks Dominik]循环遍历对象的属性名称和值,或者换句话说,关联数组的键和值:
function looper(object, callback) {
for (var key in object) {
if (object.hasOwnProperty(key)) {
if (false === callback.call(object[key], key, object[key])) {
break;
}
}
}
return object;
}
looper() 是 $.each() 的替代品
> looper({foo:1, length:0, bar:2}, console.log)
foo 1
length 0
bar 2
Just like $.each():
- 在回调内部,
this 是每个值
- 在回调内部,返回
false(不仅仅是 falsy)终止循环
- looper() 返回最初传递给它的对象
- looper() 适用于数组和对象。
用途:
var a = [];
looper({foo:1, length:0, bar:2}, function(k, v) {
a.push(k+"="+v);
});
console.assert("foo=1,length=0,bar=2" === a.join());
用 $.each() 试试,你会得到一个空的结果。因为它将这个特定对象解释为一个长度为零的类数组对象。