我早就知道,我可以把参数转换成一个数组:{ }。slice.call(参数),因为

参数是一类数组对象,因此可以使用它,但我还没有意识到所谓数组类似对象。

今天,有一段有效的Javascript专门从事这项工作,而且感觉太棒了。

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

复制代码代码如下所示:

ahello

{ }。map.call(A,e.touppercase)(E)->(#)= > { e、H、L、L、O }

{ }。reduceright.call(A(ACC,E)-> ACC + E = > 'olleh)#

b = { 1

{ }。reduce.call(B(ACC,E)-> ACC + E = > ABC)#



前几个操作字符串,好的,字符串也可以被视为类数组对象,但后面的B对象

它也是一个数组对象。

书中的解释:

复制代码代码如下所示:

那么到底是什么使一个对象数组像基本契约一样

数组对象等于两个简单规则。

它的整数长度属性在0范围内…2 ^ 32 u2013 1。

长度属性大于对象的最大索引。

索引是0范围内的整数…2 ^ 32 u2013 2的字符串表示形式

是对象属性的键。



只有两条简单的规则。

那么为什么参数、字符串和上面的B对象都被认为是对象数组呢

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

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

再举一个例子:

复制代码代码如下所示:

b = { 1

{}.reduce.call (b (ACC, e) - > ACC + e = >'ab') #



哦,不,它's'ab ',因为违反规则2:长度属性3,

最大索引值比长度属性大4,所以性能不正常。

它太强大了,好像只有一个接口被定义了,数组的所有方法都可以使用,只要它满足接口。

事实上,并不是所有的方法都可以用,Array.prototype.concat

这是不可能使用的,因为它是连接两个数组,你不是一个数组一定要使用它。

另一个小问题是,在创建一个字符串是不可变的(不可变的)之后,所以如何丢弃它是不可变的。

但是这本书没有解释为什么它适合这两个条件作为一系列的对象,和作者的书。

它是ECMAscript委员会的一个成员,所以它基本上是可信的。至于为什么这两个条件可以被看作是一个对象数组,我不知道谷歌已经搜索了半天,没有看到任何合理的解释。

以上是本文的全部内容,希望大家能喜欢。