Array.prototype.concat()
concat
方法将建立一个新的数组,而后将调用它的对象(this
指向的对象)中的元素以及全部参数中的数组类型的参数中的元素以及非数组类型的参数自己按照顺序放入这个新数组,并返回该数组。concat
方法并不修改调用它的对象(this
指向的对象)和参数中的各个数组自己的值,而是将他们的每一个元素拷贝一份放在组合成的新数组中。原数组中的元素有两种被拷贝的方式:javascript
对象引用(非对象直接量):concat
方法会复制对象引用放到组合的新数组里,原数组和新数组中的对象引用都指向同一个实际的对象,因此,当实际的对象被修改时,两个数组也同时会被修改,如:原数组和新数组里都有一个对象obj
,若是改变其属性,则原数组与新数组里的obj
属性都发生变化。java
字符串和数字(是原始值,而不是包装原始值的String
和Number
对象):concat
方法会复制字符串和数字的值放到新数组里。数组
var alpha = ["a", "b", "c"]; var numeric = [1, 2, 3]; // 组成新数组 ["a", "b", "c", 1, 2, 3]; 原数组 alpha 和 numeric 未被修改 var alphaNumeric = alpha.concat(numeric);
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);
var alpha = ['a', 'b', 'c']; // 组成新数组 ["a", "b", "c", 1, 2, 3], 原alpha数组未被修改 var alphaNumeric = alpha.concat(1, [2, 3]);
Array.prototype.push()
push()
方法添加一个或多个元素到数组的末尾,并返回数组新的长度(length
属性值)。app
arr.push(element1, ..., elementN)
this
var sports = ["soccer", "baseball"]; var total = sports.push("football", "swimming"); console.log(sports); // ["soccer", "baseball", "football", "swimming"] console.log(total); // 4
错误方法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']
Array.prototype.concat()
返回一个新数组,不会改变原数组,可是会占用较多内存。对象
Array.prototype.push()
会改变this
数组,返回最新length
属性,占用内存较少。ip
参考:内存