J**aScript 里的类数组对象

时间:2016.04.19 发布人:hy4579211

J**aScript 里的类数组对象

已解决问题

谷歌hy4579211用户在2016.04.19提交了关于“滇池J**aScript 里的类数组对象”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-25T20:53:09。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,滴水之恩,来日我当涌泉相报 !

希望以下的回答,能够帮助你。

第1个回答

用户名:jcwsht  

很早以前我就知道可以把arguments转问答化为数组:[].**考兴整国*.call(argu金ments),因为
arguments是个类数组对象,所以才可以这么用。但是我一直不清楚什么叫做类数组对象(array-likeobjects)

今天看Effective局核J**aScript就有一节是专门讲这个的,感觉真是太拽了。

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

复制代码代码如下:
a="hello"
[].***.call(a利能引约岩号成实,(e)->e.toUpperCase())视前区己#=>['h**','E','L','L','O']
[].***.call(a,(acc,e)->acc+e)#=>'olleh'
b={1:"a",2:"b",4:"c",length:6}
[].***.ca松系征张井ll(b,(acc,e劳升鸡东北)->acc+e)#=>'abc'

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

看书上的解释:

复制代码代码如下:
Sowhatexactlym笑各哥建齐假态套迅县**esanobject“array-like”?Thebasiccontractof
anarrayobjectamountstotwosimplerules.
Ithasanintegerlengthpro论祖稳总龙系pertyinth树格啊各至erange02^32–1.
Thelengthpropertyisgreaterthanthelargestindexoftheobject.
光低因老虽到Anindexisanintegeri完文增程ntherange02^32–2wh先绿磁村文帝座药井想八osestringrepresentation
ist田外布架降层武周儿况料hekeyofapropertyoftheobject.

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

所以为什么ar指略现牛湖子guments,字符串,和上着磁从攻合析区宪食面那个b对象可以看作类数组对象呢?

它们都有一个合法的length属性(0到2**32-1之间的正整数)。
length属性的值大于它们的最大索引(index)。
再举个例子:

复制代码代码如下:
b={1:"a",2:"b",4:"c",length:3}
[].***.call(b,(acc,e)->acc+e)#=>'ab'

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

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

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

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

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

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