虽然.map()
方法的接口是.map( callback(index, domElement) )
,但它是$.map( array, callback(elementOfArray, indexInArray) )
用于 $.map()... 关于 $.map() 选择将返回的参数按值索引等顺序放置的原因有什么想法吗?
3 回答
因为 API 不完善。它一开始是不一致的,但现在修复它会破坏现有的使用$.map()
.
- http://bugs.jquery.com/ticket/5686:“没有办法解决这个问题并保持向后兼容性。”
- http://bugs.jquery.com/ticket/7008:“args 是颠倒的,但它会破坏很多代码来改变它。”
如果您研究 jQuery API,您会注意到所有在一组选定元素上工作并接受回调的方法,例如.each
、.html
、.text
等,都将元素的索引作为第一个参数传递,即.map
在这里对齐。通常您使用回调内部访问当前元素this
,这只是 jQuery 中的一种常见模式,因此开发人员可能已经决定将索引作为第一个参数更重要。
另一方面,本机Array.prototype.map
方法将元素的值作为第一个参数传递给回调,因此以相同的方式工作似乎是有意义$.map
的,因为它应该处理一组通用的项目。
是的,jQuery().map() 和 jQuery.map() 是有区别的。
概述一些差异:
jQuery.map() = 这倾向于迭代泛型集合
jQuery().map() = 类数组对象必须转换为数组 (.makeArray())
jQuery.map() = 主要用于获取或设置元素集合的值并返回该新数组
.map() 也是一个 ECMAScript5 函数,并在 jQuery 之外定义(尽管已实现)。有人想知道 jQuery().map() 是否是一个较旧的实现。.map() 显然更快!
John Resig 指出,“jQuery.map 主要设计用于 DOM 元素数组(如文档中所述)。因此,它会执行诸如去除 null/undefined 之类的操作,并将节点数组扁平化为单个数组。 " 这在 ECMA (Mozilla) 中定义。另一个实现是 Resig 自己的,因此有所不同。这不是糟糕的设计!!!!!!! 读
第二个原因:“它并不像“修复它”那么简单......jQuery.map 的回调具有匹配 Array.prototype.map 的参数顺序,而 jQuery.fn.map 的参数顺序匹配所有其他 jQuery 对象迭代器回调参数顺序。更改为一种或另一种会破坏向后兼容性,jQuery 极力避免这种情况” 阅读