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