JavaScript 語言核心(8)數字為特性的陣列
JavaScript 語言核心(7)ECMAScrpt 5 物件與特性操作 << 前情 陣列是記憶體中線性的連續資料,在 JavaScript 中,並沒有實際的陣列,而是以物件來模擬出相似的操作外觀。如果你要在 JavaScript 中建立所謂的陣列(以下還是先簡稱陣列),可以使用 > var array1 = new Array(); undefined > array1.length; 0 > var array2 = new Array(10); undefined > array2.length; 10 > var array3 = new Array(10, 20, 30); undefined > array3.length; 3 > 上面示範了三種 實際上,很少人會直接使用 > var array1 = []; undefined > array1.length; 0 > var array2 = []; undefined > array2.length = 10; 10 > array2.length; 10 > var array3 = [10, 20, 30]; undefined > array3.length; 3 > 你並沒有看錯,在 JavaScript 中, function print(array) { for(var i = 0; i < array.length; i++) { console.log(array[i]); } } var array = [1, 2, 3]; print(array); // 1 2 3 console.log('........'); array.length = 5; print(array); // 1 2 3 undefined undefined console.log('........'); array.length = 2; print(array); // 1 2 console.log('........'); array.length = 3; print(array); // 1 2 undefined 在上面的例子中,陣列原本的長度為3,後來設定 陣列是記憶體中線性的連續資料,在 JavaScript 中,並沒有實際的陣列,而是以物件來模擬出相似的操作外觀,事實上,用 > var array = [1, 2, 3]; undefined > array['0']; 1 > array['1']; 2 > array['2']; 3 > for(var i in array) { ... console.log(i); ... } 0 1 2 undefined > delete array[1]; true > array [ 1, , 3 ] > 也因此,因為索引其實就是陣列物件上的特性,你也可以用 function print(array) { for(var i = 0; i < array.length; i++) { console.log(array[i]); } } // 顯示 100 200 300 print({ '0' : 100, '1' : 200, '2' : 300, length : 3 }); 在 JavaScript 中如上模擬出所謂的陣列,是非常普遍的應用。那麼,建構 > var array = []; undefined > array.length; 0 > array[0] = 100; 100 > array.length; 1 > array[10] = 900; 900 > array.length; 11 > 陣列的長度隨時可以增加或減少,指定索引元素時也不一定要連續指定,例如上例中,直接指定了索引 10 為 900,其它未指定的2到9索引處,全都是 直接使用 var names = ["Justin", "Monica", "Irene"]; names.sort(function(n1, n2) { return n1.length - n2.length; }) .forEach(function(elem) { // Irene Justin Monica console.log(elem); });
var obj = { '0' : 100, '1' : 200, '2' : 300, length : 3 }; obj.forEach = Array.prototype.forEach; obj.forEach(function(elem, index, arr) { console.log(elem); }); obj.forEach(console.log); 上面範例的執行結果是: 100 200 300 100 0 { '0': 100, '1': 200, '2': 300, length: 3, forEach: [Function: forEach] } 200 1 { '0': 100, '1': 200, '2': 300, length: 3, forEach: [Function: forEach] } 300 2 { '0': 100, '1': 200, '2': 300, length: 3, forEach: [Function: forEach] } 陣列中每個元素會作為引數傳入函式,這是 JavaScript 風格的走訪陣列方式,ECMAScript 5 規範的 function isLength5(value, index, array) { return value.length === 5; } function lengthLessThan6(value, index, array) { return value.length < 6; } var names = ["Justin", "Monica", "Irene"]; console.log(names.every(isLength5)); // false console.log(names.some(lengthLessThan6)); // true 處理一串資料時常用的 var names = ["Justin", "Monica", "Irene"]; var sum = names.filter(function(elem) { return elem.length > 5; }) .map(function(elem) { return elem.length; }) .reduce(function(accum, elem) { return accum + elem; }, 0); console.log(sum); // 12
|