如何在JavaScript中初始化數組的長度?

我閱讀過的有關JavaScript數組的大多數教程(包括w3schoolsdevguru )都建議您能夠經過使用var test = new Array(4);將整數傳遞給Array構造函數來初始化具備必定長度的數組var test = new Array(4); 句法。 html

在個人js文件中自由使用此語法後,我經過jsLint運行了其中一個文件,結果很糟糕html5

錯誤:第1行第22個字符處出現問題:預期爲「)」,而是看到了「 4」。
var test = new Array(4);
第1行第23個字元的問題:預期爲';' 而是看到')'。
var test = new Array(4);
第1行第23個字符處的問題:須要一個標識符,而看到了')'。 node

閱讀完jsLint對其行爲的解釋以後 ,看起來jsLint並不真正喜歡new Array()語法,而是在聲明數組時更喜歡[]數組

因此我有幾個問題。 首先,爲何? 經過使用new Array()語法是否會冒任何風險? 我應該注意瀏覽器的不兼容性嗎? 其次,若是我切換到方括號語法,是否有任何方法能夠聲明一個數組並將其長度所有設置在一行上,或者我必須執行如下操做: 瀏覽器

var test = [];
test.length = 4;

#1樓

如上所述,使用new Array(size)有點危險。 而不是直接使用它,而是將其放在「數組建立器函數」中。 您能夠輕鬆地確保此函數沒有錯誤,而且避免了直接調用new Array(size)的危險。 另外,您能夠爲其提供可選的默認初始值。 此createArray函數正是這樣作的: app

function createArray(size, defaultVal) {
    var arr = new Array(size);
    if (arguments.length == 2) {
        // optional default value
        for (int i = 0; i < size; ++i) {
            arr[i] = defaultVal;
        }
    }
    return arr;
}

#2樓

(這多是更好的評論,但時間太長了) 函數

所以,看完這篇文章後,我很好奇預分配其實是否更快,由於從理論上講應該如此。 可是,此博客提供了一些建議,建議不要使用它http://www.html5rocks.com/en/tutorials/speed/v8/性能

所以仍然不肯定,我將其進行了測試。 事實證實,它彷佛實際上要慢一些。 測試

var time = Date.now();
var temp = [];
for(var i=0;i<100000;i++){
    temp[i]=i;
}
console.log(Date.now()-time);


var time = Date.now();
var temp2 = new Array(100000);
for(var i=0;i<100000;i++){
    temp2[i] = i;
}
console.log(Date.now()-time);

通過幾回隨意運行後,此代碼將產生如下內容: spa

$ node main.js 
9
16
$ node main.js 
8
14
$ node main.js 
7
20
$ node main.js 
9
14
$ node main.js 
9
19

#3樓

令我驚訝的是,尚未一個功能性的解決方案可讓您在一行中設置長度。 如下基於UnderscoreJS:

var test = _.map(_.range(4), function () { return undefined; });
console.log(test.length);

因爲上述緣由,除非我想將數組初始化爲特定值,不然我將避免這樣作。 有趣的是,還有其餘實現範圍的庫,包括Lo-dash和Lazy,它們可能具備不一樣的性能特徵。


#4樓

var arr=[];
arr[5]=0;
alert("length="+arr.length); // gives 6

#5樓

  • Array(5)爲您提供長度爲5但沒有值的數組,所以您沒法對其進行迭代。

  • Array.apply(null, Array(5)).map(function () {})爲您提供了一個長度爲5 Array.apply(null, Array(5)).map(function () {})定義爲值的數組,如今能夠對其進行迭代。

  • Array.apply(null, Array(5)).map(function (x, i) { return i; })提供長度爲5且值爲0、一、二、三、4的數組。

  • Array(5).forEach(alert)不執行任何操做, Array.apply(null, Array(5)).forEach(alert)給您5條警報

  • ES6爲咱們提供了Array.from所以如今您還可使用Array.from(Array(5)).forEach(alert)

  • 若是您想使用某個值進行初始化,那麼這些都是很好的認識...
    Array.from('abcde')Array.from('x'.repeat(5))
    Array.from({length: 5}, (v, i) => i) // gives [0, 1, 2, 3, 4]

相關文章
相關標籤/搜索