Array中会改变自身的方法

es6之前: push、pop、shift、unshift、reverse、sort、splice
es6: fill、copyWithin

Array.prototype.push()

push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。

  • push 方法具有通用性。该方法和 call() 或 apply() 一起使用时,可应用在类似数组的对象上。

  • push 方法根据 length 属性来决定从哪里开始插入给定的值。如果 length 不能被转成一个数值,则插入的元素索引为 0,包括 length 不存在时。当 length 不存在时,将会创建它。

  • 唯一的原生类数组(array-like)对象是 Strings,尽管如此,它们并不适用该方法,因为字符串是不可改变的。

1
2
3
4
5
6
7
8
const arr = [ 1, 2, 3 ]
const arr2 = [ 5, 6 ]

arr.push(4) // 4
// arr = [ 1, 2, 3, 4 ]

Array.prototype.push.apply(arr, arr2) // 6
// arr = [ 1, 2, 3, 4, 5, 6 ]

Array.prototype.pop()

pop() 方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。

  • pop 方法有意具有通用性。该方法和 call() 或 apply() 一起使用时,可应用在类似数组的对象上。pop方法根据 length属性来确定最后一个元素的位置。如果不包含length属性或length属性不能被转成一个数值,会将length置为0,并返回undefined。

  • 如果你在一个空数组上调用 pop(),它返回 undefined。

1
2
3
4
const arr = [ 1, 2, 3 ]

arr.pop() // 3
// arr = [ 1, 2 ]

Array.prototype.shift()

shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。

  • shift 方法移除索引为 0 的元素(即第一个元素),并返回被移除的元素,其他元素的索引值随之减 1。如果 length 属性的值为 0 (长度为 0),则返回 undefined。

  • shift 方法并不局限于数组:这个方法能够通过 call 或 apply 方法作用于类似数组的对象上。但是对于没有 length 属性(从0开始的一系列连续的数字属性的最后一个)的对象,调用该方法可能没有任何意义。

  • Array.prototype.pop() 有着和 shift相似的行为, 但是是作用在数组的最后一个元素上的。

1
2
3
4
const arr = [ 1, 2, 3 ]

arr.shift() // 1
// arr = [ 2, 3 ]

Array.prototype.unshift()

unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。

  • unshift 方法会在调用它的类数组对象的开始位置插入给定的参数。

  • unshift 特意被设计成具有通用性;这个方法能够通过 call 或 apply 方法作用于类数组对象上。不过对于没有 length 属性(代表从0开始的一系列连续的数字属性的最后一个)的对象,调用该方法可能没有任何意义。

  • 注意, 如果传入多个参数,它们会被以块的形式插入到对象的开始位置,它们的顺序和被作为参数传入时的顺序一致。 于是,传入多个参数调用一次 unshift ,和传入一个参数调用多次 unshift (例如,循环调用),它们将得到不同的结果。

1
2
3
4
const arr = [ 1, 2, 3 ]

arr.unshift(4, 5) // 5
// arr = [ 1, 2, 3, 4, 5 ]

Array.prototype.reverse()

reverse() 方法将数组中元素的位置颠倒,并返回该数组。数组的第一个元素会变成最后一个,数组的最后一个元素变成第一个。该方法会改变原数组。

  • reverse 方法颠倒数组中元素的位置,改变了数组,并返回该数组的引用。

  • reverse方法是特意类化的;此方法可被 called 或 applied于类似数组对象。对象如果不包含反映一系列连续的、基于零的数值属性中的最后一个长度的属性,则该对象可能不会以任何有意义的方式运行。

1
2
3
4
const arr = [ 1, 2, 3 ]

arr.reverse() // [ 1, 2, 3, 4, 5 ]
// arr = [ 1, 2, 3, 4, 5 ]

Array.prototype.sort()

sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的

  • 如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 “Banana” 会被排列到 “cherry” 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明 compareFunction),比较的数字会先被转换为字符串,所以在Unicode顺序上 “80” 要比 “9” 要靠前。

  • 如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

    • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;

    • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);

    • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

1
2
3
4
5
6
7
const arr = [ 2, 1, 3 ]

arr.sort() // [ 1, 2, 3 ]
// arr = [ 1, 2, 3 ]

arr.sort((a, b) => a - b)) // [ 1, 2, 3 ]
arr.sort((a, b) => b - a)) // [ 3, 2, 1 ]

Array.prototype.splice()

splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。

语法

array.splice(start[, deleteCount[, item1[, item2[, …]]]])

start

指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于array.length-n);如果负数的绝对值大于数组的长度,则表示开始位置为第0位。

deleteCount - 可选参数

  • 整数,表示要移除的数组元素的个数。

  • 如果 deleteCount 大于 start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。

  • 如果 deleteCount 被省略了,或者它的值大于等于array.length - start(也就是说,如果它大于或者等于start之后的所有元素的数量),那么start之后数组的所有元素都会被删除。

  • 如果 deleteCount 是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。

item1, item2, … - 可选参数

  • 要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
const arr = [ 1, 4, 5 ]

// 插入2和3
arr.splice(1, 0, 2, 3) // []
// [ 1, 2, 3, 4, 5 ]

// 删除2
arr.splice(1, 1) // [ 2 ]
// [ 1, 3, 4, 5 ]

// 删除最后一个
arr.splice(-1, 1) // [5]
// [ 1, 3, 4 ]