JavaScript 里的類數(shù)組對象
來源:易賢網(wǎng) 閱讀:2164 次 日期:2015-04-09 16:22:26
溫馨提示:易賢網(wǎng)小編為您整理了“JavaScript 里的類數(shù)組對象”,方便廣大網(wǎng)友查閱!

很早以前我就知道可以把 arguments 轉(zhuǎn)化為數(shù)組:[].slice.call(arguments),因為

arguments 是個類數(shù)組對象,所以才可以這么用。但是我一直不清楚什么叫做類數(shù)組對象( array-like objects)

今天看 Effective JavaScript 就有一節(jié)是專門講這個的,感覺真是太拽了。

先看我寫的一些示例代碼:

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'

前面那幾個是操作字符串的,嗯,字符串也可以看成類數(shù)組對象。但是后面那個 b 對象居然

也是類數(shù)組對象。

看書上的解釋:

代碼如下:

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.

居然只有這兩條簡單的規(guī)則。

所以為什么 arguments, 字符串,和上面那個 b 對象可以看作類數(shù)組對象呢?

它們都有一個合法的 length 屬性(0 到 2**32 - 1 之間的正整數(shù))。

length 屬性的值大于它們的最大索引(index)。

再舉個例子:

代碼如下:

b = {1: "a", 2: "b", 4: "c", length: 3}

[].reduce.call(b, (acc, e) -> acc + e) # => 'ab'

嗯,就不對了,成了'ab' 了,因為違反了規(guī)則2:length 屬性是3,

最大索引值是4要比 length 屬性大了。所以表現(xiàn)的不正常了。

太強(qiáng)大了,好像只是定義了一個接口,只要符合這個接口,就可以利用數(shù)組的所有方法。

其實不是可以利用所有方法,Array.prototype.concat

是不能用的,因為它是把兩個數(shù)組連接起來,你不是數(shù)組肯定是沒法用它的。

還有一個小問題是,字符串創(chuàng)建以后是不可變的(immutable),所以你怎么折騰它都是不可變的。

但是這本書根本就沒有解釋為什么是符合這兩個條件就可以看成類數(shù)組對象,另外這本書的作者

是那個什么 ECMAScript 委員會的成員,所以基本還是可信的。至于為什么符合這兩個條件就可以看成是類數(shù)組對象,我也不知道,谷歌搜了半天也沒看到什么合理的解釋。

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

更多信息請查看IT技術(shù)專欄

更多信息請查看腳本欄目
易賢網(wǎng)手機(jī)網(wǎng)站地址:JavaScript 里的類數(shù)組對象
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機(jī)號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)