push方法是数组中的
var arr = []
var length = arr.push('first')
console.log(arr) // ['first']
console.log(length) // 1 push方法会改变原有数组,且返回改变后数组的长度
尝试添加各种元素
var arr = []
arr.push({})
console.log(arr) // [Object]
arr.push([],{},'str',1,null,undefined) // 添加多个元素用逗号隔开
console.log(arr) // Array, Object, 1, null, undefined
添加多个元素
- ES6的数组扩展
var arr = [1,2,3]
var nArr = ['first', 'second', 'third'] // 想依次添加每个值到数组中
// arr.push(nArr) 如果这样添加会给arr添加多一个数组元素,arr.length = 4
arr.push(...nArr) ES6的方法数组扩展
console.log(arr) // [1,2,3,'first', 'second', 'third']
// 这种扩展方法仅对Array有效
- apply使用
var arr = [1,2,3]
var nArr = ['first', 'second', 'third'] // 想依次添加每个值到数组中
Array.prototype.push.apply(arr,nArr) // apply 参数传入使用数组的方式
console.log(arr) // [1,2,3,'first', 'second', 'third']
对象能用push吗?
直接用是不行的,可以使用call方法来改用
了解V8引擎 push实现的原理
function ArrayPush () {
var n = TO_UINT32(this.length) // 被push的对象的length
var m = %_ArgumentsLength() // push的参数个数
for (var i = 0; i < m; i++) {
this[i+n] = %_Arguments(i) // 复制元素
}
this.length = n + m
return this.length
}
- 其实就是一个属性复制的过程,索引值为键,添加的参数为值,还添加多一个length属性,所以push方法对对象也是可以使用的,如果对象一开始就使用了索引值为属性名,可能被后面新添加的属性替代
var obj = {}
var obj2 = {0: 'firstValue'}
Array.prototype.push.call(obj, 'first')
Array.prototype.push.call(obj2, 'first')
console.log(obj) // {0: 'first', length: 1}
console.log(obj2) // {0: 'first', length: 1} 原本的'firstValue'会被替代