Array構造函數只帶一個數字參數時(不然是做爲填充),該參數會被做爲數組的預設長度,而非填充一個元素,所以數組內是空單元javascript
若是一個數組中存在一個空單元,即length的值大於實際單元數,這樣的數組稱爲稀疏數組java
var a = (new) Array(3) // 目前chrome返回[empty * 3], 以前好像是[undefined * 3] // new可用可不用,不用的話內部會自動添加 var b = [undefined, undefined, undefined] var c = [] c.length = 3 // 目前chrome返回[empty * 3], 以前好像是[undefined * 3]
就以前的返回值來看a,b,c很一致,但空單元與undefined並不相同chrome
a.map(function(v,i){ return i; }); // 目前chrome返回[empty * 3], 以前是[undefined * 3] b.map(function(v,i){ return i; }); // [0, 1, 2] var d = ['a', 'b', 'c', 'd'] delete d[1] d.map((item, index) => { return { item, index, } }) // (4) [{item: "a", index: 0}, empty, {item: "c", index: 2}, {item: "d", index: 3}]
好在如今返回的是empty而非undefined,能夠獲得識別數組
然而某些方法如join在對待空單元的表現與undefiend一致app
a.join('-'); // "--" b.join('-'); // "--" //實現參考以下 function fakeJoin(arr,connector) { var str = ""; for (var i = 0; i < arr.length; i++) { // 它主要考慮的是數組長度,這個是關鍵 if (i > 0) { str += connector; } if (arr[i] !== undefined) { str += arr[i]; } } return str; }
想要填充undefined在數組中而非empty能夠使用以下表達式函數
var arr = Array.apply(null, { length: 3 }) // [undefined, undefined, undefined] // apply第二參數要求是數組或類數組(存在length屬性)
ES6添加了Array.of()方法來初始化數組,在只填入一個參數的狀況是做爲數組的填充而非設置長度rest
var array1 = Array.of(3) //[3] var array2 = Array.of(1,2,3) //[1,2,3] //模擬 function arrayOfLike() { return [].slice.call(arguments) // return [...arguments] ES6 } // or function arrayOfLike(...rest) { return rest }