1. 程式人生 > >javascript語言精粹陣列篇之Array的方法注意事項

javascript語言精粹陣列篇之Array的方法注意事項

本文並沒有詳細列出Array方法詳解,本文側重點在於使用Array程式設計時候要注意的問題。
1.Array.concat

var o = {name:"Gavin"};
var a1 = [1,2,3];
var a2 = [6,o];
var arr1 = a1.concat(a2);
a1[0] = 0;
o.name = "GavinPan";
console.log(arr1);//[ 1, 2, 3, 6, {name:"GavinPan"} ] 

concat 將兩個陣列淺拷貝連線
2.Array.join

var o2 = {name:"Gavin"};
var arr2 = ['a', 1, o2];
var str2 = arr2.join('');
console.log(str2);//a1[object Object]

join 會把陣列的每一項變成字串,再把陣列變成字串。
在IE6、7的時代使用jion去連線大量字串要優於使用+號,目前建議使用+號連線,參考《高效能網站進階指南》中字串優化
3. Array.pop Array.push
可以這樣實現,只是提供一種思路
// Array.method('pop', function () {
//     return this.splice(this.length-1,1)[0];
// });
// Array.method('pop', function () {
//     this.splice.apply(
//         this, [this.length, 0].concat(Array.prototype.slice.apply(arguments))
//     );
//     return this.length;
// });
4. Array.reverse

var arr4 = [1,2,3];
var a4 = arr4.reverse();
arr4[2] = 'reverse';
console.log(arr4); //Array(3) [ 3, 2, "reverse" ]
console.log(a4); //Array(3) [ 3, 2, "reverse" ]

reverse 將陣列翻轉,返回陣列本身。arr4 與 a4 是一個數組。
5. Array.shift
移除陣列第一項,比Array.pop要慢的多
6.Array.slice(start, end)
對陣列的一段做淺拷貝,end省略表示一直到最後
7.Array.sort
 陣列排序,會把元素視為字串,不靠譜,建議自己寫。
8.Array.splice(index, count, item...)

var arr8 = [1,2,3];
var a8 = arr8.splice(1, 1,'a','b');
console.log(arr8); //[ 1, "a", "b", 3 ]
console.log(a8); //[ 2 ]

splice 從index索引位置刪除count個數的項,返回陣列刪除項。如果item不為空將在index索引位置新增item項。注意不要混淆slice,slice是淺拷貝一段陣列。
9.Array.unshif
//把元素新增到陣列的第一項
// Array.method('unshif', function(){
//     this.splice.applay(this, [0 ,0].concat(Array.prototype.slice.apply(arguments)));
//     return this.length;
// });

Array.prototype.unshif1 = function(){
    console.log(`----`)
    console.log(Array.prototype.slice.apply(arguments));
    this.splice.apply(this, [0 ,0].concat(Array.prototype.slice.apply(arguments)));
    return this.length;
};

var arr9 = [1,2,3,4];
arr9.unshif1('a','b');
console.log(arr9)

有關slice填坑,w3cschool arrayObject.slice(start,end) start 必需,但是以下結果是對的。MND中給的答案正確 arr.slice([begin[, end]]),slice可以什麼引數都不傳。

var arrtest = [1,2,3];
var arrtest1 = arrtest.slice();
console.log(arrtest1);

擴充套件解釋
Array.prototype.slice.apply(arguments),這麼寫的原因是,arguments 是類似陣列的物件,他不是陣列,所以不能使用陣列的方法slice,通過apply去呼叫陣列的slice方法,結果返回陣列。
arr9.unshif1('a','b'); 可以看做 arr9.splice(0, 0, 'a', '