JavaScript 里的类数组对象

标签:活动介绍    日期:2018-04-09 12:36    录入:美娱国际平台注册    浏览:

  

[javascript对象数组,javascript数组,javascript数组操作]JavaScript 里的类数组对象

  

很早以前我就知道可以把 arguments 转化为数组:[].slice.call(arguments),因为  
  arguments 是个类数组对象,所以才可以这么用。但是我一直不清楚什么叫做类数组对象( array-like objects)  

  

今天看 Effective JavaScript 就有一节是专门讲这个的,感觉真是太拽了。

  

  

先看我写的一些示例代码:  

  

代码如下:

  
  a = "hello"  
  [].map.call(a, (e) -> e.toUpperCase()) # => [ 'H', 'E', 'L', 'L', 'O' ]  
  [].reduceRight.call(a, (acc, e) -> acc + e) # => 'olleh'  
  b =美娱国际 {1: "a", 2: "b", 4: "c", length: 6}  
  [].reduce.call(b, (acc, e) -> acc + e) # => 'abc'  
  
  

  

前面那几个是操作字符串的,嗯,字符串也可以看成类数组对象。但是后面那个 b 对象居然  
  也是类数组对象。

  

  

看书上的解释:  

  

代码如下:

  
  So what exactly makes an object “array-like”? The basic contract of  
  an array object amounts to two simple rules.

  
  It has an integer length property in the range 0...2^32 – 1.

  
  The length property is greater than the largest index of the object.

  
  An index is an integer in the range 0...2^32 – 2 whose string representation  
  is the key of a property of the object.

  
  

  

  

居然只有这两条简单的规则。

  

  

所以为什么 arguments, 字符串,和上面那个 b 对象可以看作类数组对象呢?

  

  

它们都有一个合法的 length 属性(0 到 2**32 - 1 之间的正整数)。

  
  length 属性的值大于它们的最大索引(index)。

  
  再举个例子:  

  

代码如下:

  
  b = {1: "a", 2: "b", 4: "c", length: 3}  
  [].reduce.call(b, (acc, e) -> acc + e) # => 'ab'  
  
  

  

嗯,就不对了,成了'ab' 了,因为违反了规则2:length 属性是3,  
  最大索引值是4要比 length 属性大了。所以表现的不正常了。

  

  

太强大了,好像只是定义了一个接口,只要符合这个接口,就可以利用数组的所有方法。

  

  

其实不是可以利用所有方法,Array.prototype.concat  
  是不能用的,因为它是把两个数组连接起来,你不是数组肯定是没法用它的。

  

  

还有一个小问题是,字符串创建以后是不可变的(immutable),所以你怎么折腾它都是不可变的。

  

  

但是这本书根本就没有解释为什么是符合这两个条件就可以看成类数组对象,另外这本书的作者  
  是那个什么 ECMAScript 委员会的成员,所以基本还是可信的。至于为什么符合这两个条件就可以看成是类数组对象,我也不知道,谷歌搜了半天也没看到什么合理的解释。

  

  

以上所述就是本文的全部内容了,希望大家能够喜欢。

  

★★★小编:美娱国际 整理文章,欢迎大家转载 ★★★
上一篇:AngularJS实现表单验证功能
下一篇:Google 爬虫如何抓取 JavaScript 的内容
相关文章阅读
点击右上角的分享按钮即可收藏美娱国际平台注册 随时随地与好友一起分享精彩内容噢
最近更新
热门排行