(JavaScript) 合併數組的方法

1、Array.prototype.concat()

concat方法將建立一個新的數組,而後將調用它的對象(this指向的對象)中的元素以及全部參數中的數組類型的參數中的元素以及非數組類型的參數自己按照順序放入這個新數組,並返回該數組
concat方法並不修改調用它的對象(this指向的對象)和參數中的各個數組自己的值,而是將他們的每一個元素拷貝一份放在組合成的新數組中。原數組中的元素有兩種被拷貝的方式:javascript

  • 對象引用(非對象直接量):concat方法會複製對象引用放到組合的新數組裏,原數組和新數組中的對象引用都指向同一個實際的對象,因此,當實際的對象被修改時,兩個數組也同時會被修改,如:原數組和新數組裏都有一個對象obj,若是改變其屬性,則原數組與新數組裏的obj屬性都發生變化。java

  • 字符串和數字(是原始值,而不是包裝原始值的StringNumber對象):concat方法會複製字符串和數字的值放到新數組裏。數組

1. 鏈接兩個數組
var alpha = ["a", "b", "c"];
var numeric = [1, 2, 3];

// 組成新數組 ["a", "b", "c", 1, 2, 3]; 原數組 alpha 和 numeric 未被修改
var alphaNumeric = alpha.concat(numeric);
2. 鏈接三個數組
var num1 = [1, 2, 3];
var num2 = [4, 5, 6];
var num3 = [7, 8, 9];

// 組成新數組[1, 2, 3, 4, 5, 6, 7, 8, 9]; 原數組 num1, num2, num3 未被修改
var nums = num1.concat(num2, num3);
3. 將非數組值合併到數組裏
var alpha = ['a', 'b', 'c'];

// 組成新數組 ["a", "b", "c", 1, 2, 3], 原alpha數組未被修改
var alphaNumeric = alpha.concat(1, [2, 3]);

2、Array.prototype.push()

push()方法添加一個或多個元素到數組的末尾,並返回數組新的長度(length屬性值)app

arr.push(element1, ..., elementN)this

1. 添加元素到數組
var sports = ["soccer", "baseball"];
var total = sports.push("football", "swimming");

console.log(sports); // ["soccer", "baseball", "football", "swimming"]
console.log(total);  // 4
2. 合併兩個數組

錯誤方法prototype

var sports1 = ['soccer', 'baseball'];
var sports2 = ['football', 'swimming'];

var total = sports1.push(sports2);
    
/* or */

var total = Array.prototype.push.call(sports1, sports2);
    
console.log(sports1);    // ['soccter', 'baseball', ['football', 'swimming']]

應該用apply方法,將被push的數組當成參數數組。code

var sports1 = ['soccer', 'baseball'];
var sports2 = ['football', 'swimming'];

var total = Array.prototype.push.apply(sports1, sports2);
console.log(sports1);    // ['soccter', 'baseball', 'football', 'swimming']

3、選擇哪一個方法

  • Array.prototype.concat()返回一個新數組,不會改變原數組,可是會佔用較多內存。對象

  • Array.prototype.push()會改變this數組,返回最新length屬性,佔用內存較少。ip

參考:內存

相關文章
相關標籤/搜索