Кто-нибудь знает, почему отличная в остальном функция 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
});
Не то чтобы это меня сильно беспокоило, я предпочитаю использовать нативные полифиллы для наиболее распространенных новых функций массива, но мне всегда было любопытно конструктивное решение. Может быть, это было сделано в старые времена, до того, как браузеры внедрили родной forEach
, и поддержка старых версий не позволяла им изменить его, или...?
Или, может быть, он разработан таким образом, потому что его можно использовать и для нативных объектов, тогда «имеет смысл» помещать ключ перед значением в обратном вызове...?
Примечание: я знаю, что underscore.js (и, возможно, другие библиотеки) делает это наоборот (больше похоже на нативную функцию).
(entry, index)
находится в том порядке, в котором они есть. Я не знаю, почему это не было бы(key, value)
, посколькуkey
совпадает сindex
для массивов, и вы обычно ссылаетесь на вещи какkey, value
. Просто моя точка зрения... - person Ian   schedule 27.10.2012arr.map(Number)
Или мы можем отфильтровать его до списка значений, которые не допускают числовое преобразование:arr.filter(isNaN)
. - person I Hate Lazy   schedule 27.10.2012