【发布时间】:2012-10-17 05:33:24
【问题描述】:
有谁知道为什么原本出色的jQuery.each 函数的设计与(现在)原生的Array.forEach 不同?前:
var arr = ['abc','def'];
arr.forEach(function(entry, index) {
console.log(entry); // abc / def
});
这绝对有道理。但是 jQuery 选择将index 作为第一个参数:
$.each(arr, function(index, entry) {
console.log(entry);
});
有人知道这个设计决定背后的原因吗?我一直广泛使用$.each,但它总是困扰着我,索引是第一个参数,因为它很少使用。我知道 jQuery 通过this 实现了直接引用,但如果这样做会很混乱:
var arr = ['abc','def'];
$.each(arr, function() {
console.log(this === 'abc'); // false both times, since this is a String constructor
});
并不是它让我如此困扰,我更喜欢将原生 polyfills 用于最常见的新数组函数,但我一直对设计决策感到好奇。也许它是在浏览器实现本机 forEach 之前制作的,并且旧版支持阻止他们更改它,或者......?
或者,它是这样设计的,因为它也可以用于本机对象,然后在回调中将键放在值之前“有意义”...?
旁注:我知道 underscore.js(可能还有其他库)会反过来(更类似于原生函数)。
【问题讨论】:
-
jQuery 的不合格版本也无法像原生方法那样跳过数组中的漏洞。
-
附带说明,Underscore 不仅仅是“更类似于原生函数”;如果存在,它实际上使用本机函数(如果不存在,它使用专门设计用于镜像本机函数的实现)。
-
我知道这没关系,但我认为我什至不同意
(entry, index)的顺序。我不知道为什么不是(key, value),因为key与数组的index相同,您通常将其引用为key, value。只是我的观点... -
对值进行操作的函数通常接受单个值参数。因此,本机迭代器将值作为第一个参数传递给回调非常方便。这使得函数更有用,因为它们可以很容易地独立使用或用作迭代器回调。例如,使用本机函数,我们可以将数组转换为每个成员的数值转换:
arr.map(Number)或者我们可以将其过滤为不允许数值转换的值列表:arr.filter(isNaN)。
标签: javascript jquery api foreach each