国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript中的稀疏數組與密集數組[譯]

2024-05-06 14:21:14
字體:
來源:轉載
供稿:網友
1.稀疏數組
創建一個指定長度的稀疏數組很簡單:
代碼如下:
> var a = new Array(3);
> a
[ , , ]
> a.length
3
> a[0]
undefined

當你遍歷它時,你會發現,它并沒有元素.JavaScript會跳過這些縫隙.
代碼如下:
> a.forEach(function (x, i) { console.log(i+". "+x) });
> a.map(function (x, i) { return i })
[ , , ]

譯者注:還有一些其他情況會生成稀疏數組,比如
代碼如下:
>var arr = [];
>arr[0] = 0;
>arr[100] = 100>a.forEach(function (x, i) { console.log(i+". "+x) });0. 0100. 100

2.密集數組

Brandon Benvie 最近在es-discuss郵件討論組中提到了一個創建密集數組的技巧:

代碼如下:
> var a = Array.apply(null, Array(3));
> a
[ undefined, undefined, undefined ]


上面的語句其實等同于:

Array(undefined, undefined, undefined)

但從表面上看,貌似這個數組和之前的稀疏數組并沒有太多的區別:
代碼如下:
> a.length
3
> a[0]
undefined

可是,你現在可以遍歷到這些數組元素了,還可以為每個元素重新賦值:
代碼如下:
> a.forEach(function (x, i) { console.log(i+". "+x) });
0. undefined
1. undefined
2. undefined

> a.map(function (x, i) { return i })
[ 0, 1, 2 ]

譯者注:實際上,JavaScript并沒有常規的數組,所有的數組其實就是個對象,只不過會自動管理一些"數字"屬性和length屬性罷了.說的更直接一點,JavaScript中的數組根本沒有索引,因為索引應該是數字,而JavaScript中數組的索引其實是字符串.arr[1]其實就是arr["1"],給arr["1000"] = 1,arr.length也會自動變為1001.這些表現的根本原因就是,JavaScript中的對象就是字符串到任意值的鍵值對.注意鍵只能是字符串.這和AWK類似.不信可以試試awk 'BEGIN{a[1]=1;print(a["1"])}'.也許這是因為Brendan Eich在發明JavaScript時參考了不少awk的設計的原因.不過目前,ES6中已經有了類似于Java等語言的Map類型,鍵可以是任意類型的值.請參考我翻譯的MDN文檔Map

3.另一個技巧
郵件里還提到了另外一個技巧:
代碼如下:
> Array.apply(null, Array(3)).map(Function.prototype.call.bind(Number))
[ 0, 1, 2 ]

這大概等同于下面的寫法
代碼如下:
Array.apply(null, Array(3)).map(
function (x,i,...) { return Number.call(x,i,...) })

注意,x是call方法的第一個參數,它作為了Number函數中的this值.這個值沒有什么意義,相當于被忽略.我更喜歡下面這個能讓人一眼就看明白的寫法:
代碼如下:
Array.apply(null, Array(3)).map(function (x,i) { return i })

譯者注:
代碼如下:
Array.apply(null, Array(3)).map(Function.prototype.call.bind(Number))
//等同于Array.apply(null, Array(3)).map(Function.prototype.call,Number)

雖然使用自定義的函數更清晰,但自定義的函數肯定沒有原生方法快.舉個例子:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 鄂尔多斯市| 鹤山市| 高平市| 通山县| 武隆县| 恩施市| 武安市| 石台县| 淮北市| 顺昌县| 山丹县| 华阴市| 华蓥市| 茶陵县| 兰西县| 扶余县| 前郭尔| 长垣县| 迁西县| 江油市| 长春市| 汪清县| 南乐县| 博白县| 宁夏| 瓮安县| 卫辉市| 茌平县| 永泰县| 夏津县| 宁武县| 锡林浩特市| 陆河县| 平果县| 康保县| 永宁县| 承德市| 锡林郭勒盟| 东海县| 锡林郭勒盟| 新沂市|