我閱讀過的有關JavaScript數組的大多數教程(包括w3schools和devguru )都建議您能夠經過使用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;
如上所述,使用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; }
(這多是更好的評論,但時間太長了) 函數
所以,看完這篇文章後,我很好奇預分配其實是否更快,由於從理論上講應該如此。 可是,此博客提供了一些建議,建議不要使用它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
令我驚訝的是,尚未一個功能性的解決方案可讓您在一行中設置長度。 如下基於UnderscoreJS:
var test = _.map(_.range(4), function () { return undefined; }); console.log(test.length);
因爲上述緣由,除非我想將數組初始化爲特定值,不然我將避免這樣作。 有趣的是,還有其餘實現範圍的庫,包括Lo-dash和Lazy,它們可能具備不一樣的性能特徵。
var arr=[]; arr[5]=0; alert("length="+arr.length); // gives 6
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]