JavaScript中的稀疏數組與密集數組

什麼是稀疏呢?稀疏也就是說,數組中的元素之間可以有空隙,因爲一個數組其實就是一個鍵值映射。

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. 0
100. 100

2. 密集數組

> 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中的數組根本沒有索引,因爲索引應該是數字,而JavaScript中數組的索引其實是字符串:arr[1]其實就是arr[“1”],給arr[“1000”] = 1,arr.length也會自動變爲1001。

原因就是:JavaScript中的對象就是字符串到任意值的鍵值對。注意鍵只能是字符串。

3. 另一個技巧

> Array.apply(null, Array(3)).map(Function.prototype.call.bind(Number))
[ 0, 1, 2 ]

//  等同於下面的寫法:  x是call方法的第一個參數,它作爲了Number函數中的this值
Array.apply(null, Array(3)).map(
    function (x,i,...) { return Number.call(x,i,...) })

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)

雖然使用自定義的函數更清晰,但自定義的函數肯定沒有原生方法快

var a = ["aaa  ", "  bbb", "  ccc  "]

a.map(function(x) { return x.trim(); });               // ['aaa', 'bbb', 'ccc']
a.map(Function.prototype.call, String.prototype.trim); // ['aaa', 'bbb', 'ccc']

4. 實際用途

在JavaScript中,可以用Array(100).join("a")來創建密集數據。但是有個問題就是兩個元素才1個坑,因爲2個才能join。100個元素就需要101個。

在這裏插入圖片描述

參考11111

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章