里的类数组对象

作者: 网络应用  发布:2019-09-06

很早从前小编就精通能够把 arguments 转化为数组:[].slice.call(arguments),因为
arguments 是个类数组对象,所以才足以这么用。可是本身平昔不晓得哪些叫做类数组对象( array-like objects)

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 委员会的成员,所以基本照旧可信赖的。至于何以符合那多个规范就能够用作是类数组对象,笔者也不精通,Google搜了半天也没看到什么样合理的解释。

如上所述正是本文的全体内容了,希望大家能够喜欢。

里的类数组对象,javascript数组 很早以前自个儿就理解能够把 arguments 转化为数组:[].slice.call(arguments),因为 arguments 是个类数组对象,...

明天看 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 委员会的成员,所以基本照旧可靠的。至于缘何符合这七个尺码就足以看做是类数组对象,小编也不亮堂,Google搜了半天也没看到什么样合理的分解。

如上所述正是本文的全体内容了,希望大家能够欣赏。

您大概感兴趣的稿子:

  • js将类数组对象转变到数组对象
  • JavaScript中的类数组对象介绍
  • js 用于检验类数组对象的函数方法
  • JQuery $.each遍历JavaScript数组对象实例
  • js使用Array.prototype.sort()对数组对象排序的艺术
  • js接收并转载Java中的数组对象的方法
  • JS从非数组对象转数组的办法小结
  • javascript Array数组对象的扩充函数代码
  • JavaScript类数组对象调换为数组对象的措施实例深入分析

本文由王中王开奖结果发布于网络应用,转载请注明出处:里的类数组对象

关键词: