为什么我可以在不是数组的对象上调用Array.prototype.filter()?

时间:2012-04-15 03:22:41

标签: javascript

filter    Creates a new array with all elements that pass
          the test implemented by the provided function.

>>> 'abc'.filter(function(e){return e!='b'})
TypeError: "abc".filter is not a function

>>> Array.prototype.filter.call('abc', function(e){return e!='b'})
["a", "c"]

>>> jQuery.isArray('abc')
false

2 个答案:

答案 0 :(得分:4)

所有数组方法都是通用的;即,它们处理具有数字属性和length属性的任何对象。例如,请参阅the specification for Array.prototype.filter:请注意,该算法完全用

之类的术语表达
  

lenValue成为使用参数[[Get]]调用O "length"内部方法的结果。

  

kPresent成为使用参数[[HasProperty]]调用O Pk内部方法的结果。


Array.filtera Firefox-specific extension,BTW。跨浏览器版本为Array.prototype.filter.call

答案 1 :(得分:1)

您可以这样做,因为Array.filter 1 被定义为通用的;例如,你可以在NodeList上调用它。这对开发人员来说只是一种便利。它也适用于字符串,因为在现代浏览器中(IE 8及更早版本之外的所有内容),您可以像访问数组的索引一样访问字符串中的字符,这就是filter所基于的内容,以及{{ 1}}:

length

但是,如果您计划支持Internet Explorer 8或更早版本,我建议不要使用此功能,因为ES5 shivs可能无法检测到上下文是字符串的事实,这会破坏事物。< / p>

1 以及所有其他var str = "Hello, world!"; str[2] // 'l' 方法。除了,再一次,在Internet Explorer 8及更早版本上。