跟着mdn学习Javascript之数组篇二:插入/删除/合并

71 阅读4分钟

你知道Javascript中的数组方法总共有多少个吗?41个哦! 最近有点时间,就跟着mdn的api一个个复习了一下,真的是很惊艳!自己总结了一下,做个记录吧!

1. Array.prototype.pop()

返回值

  • 从数组中删除 最后一个元素,并返回该元素的值,当数组为空时返回undefined
  • 此方法会修改数组长度
const arr = [1, 2, 3, 5];
const popped = arr.pop();
console.log(arr);
// [1, 2, 3]
console.log(popped);
// 5

2. Array.prototype.shift()

返回值

  • 从数组中删除 第一个元素,并返回该元素的值,当数组为空时返回undefined
  • 此方法会修改数组长度
const arr = [1, 2, 3, 5];
const shifted = arr.shift();
console.log(arr);
// [2, 3, 5]
console.log(shifted);
// 1

3. Array.prototype.push()

返回值

  • 将指定元素添加数组末尾,并返回新的数组长度
  • 此方法会修改数组长度
const arr = [1, 2, 3, 5];
const pushed = arr.push(4);
console.log(arr);
// [1, 2, 3, 5, 4]
console.log(pushed);
// 5

4. Array.prototype.unshift()

返回值

  • 将指定元素添加数组头部,并返回新的数组长度
  • 此方法会修改数组长度
const arr = [1, 2, 3, 5];
const unshifted = arr.unshift(4);
console.log(arr);
// [4, 1, 2, 3, 5]
console.log(pushed);
// 5

5. Array.prototype.slice(start?, end?)

返回值

  • 返回一个新数组,是一个由start和end决定的原数组的浅拷贝(包括start,不包括end),原始数组不改变
  • 对于稀疏数组,会保留空槽

语法

slice()
slice(start)
slice(start, end)
const arr = [1, 2, 3, , 5];
const sliced1 = arr.slice();
const sliced2 = arr.slice(1);
const sliced3 = arr.slice(2, 4);
// arr: [1, 2, 3, , 5]
// sliced1: [1, 2, 3, , 5]
// sliced2: [2, 3, , 5]
// sliced3: [3, ]

6. Array.prototype.splice()

返回值

  • 通过移除或替换已存在的元素和/或添加新元素 就地 改变一个数组
  • 返回一个包含了删除元素的数组
    • 如只移除一个元素,则返回一个元素的数组
    • 如没有删除任何元素,则返回一个空数组
    • 如删除的部分是稀疏的,则返回的数组也是稀疏的

语法

splice(start?)
splice(start, deleteCount?)
splice(start, deleteCount?, item1?)
splice(start, deleteCount?, item1?, item2?, itemN?)
  • start:从0开始计算的索引
    • 如start < 0,使用start + array.length
    • 如start < -array.length, 则使用0
    • 如start > array.lenght,不会删除任何元素,但会表现为添加元素的函数,添加所提供的那些元素
    • 如start被省略,不会删除任何元素。 传undefined会被转化为0
  • deleteCount(可选):整数,表示数组中要从start开始阐述的元素数量
    • 省略deleteCount或deleteCount >= array.length - start,则从start到数组末尾的所有元素将被删除
    • deleteCount <= 0,不删除任何元素,这种情况下,应至少指定一个新元素
  • item1,...,itemN(可选)
    • 从start开始要加入到数组中的元素
    • 如不指定任何元素,splice()将只从数组中删除元素
const arr = [1, 2, 3, 5];
const spliced1 = arr.splice(1);
// arr: [1]
// spliced1: [2, 3, 5]

const spliced2 = spliced1.splice(1, 0, 8);
// spliced1: [2, 8, 3, 5]
// spliced2: []

const spliced3 = spliced1.splice(2, 1);
// spliced1: [2, 8, 5]
// spliced3: [3]

7. Array.prototype.toSpliced()

返回值

  • 是splice()的复制方法,返回一个新数组,并在给定索引处删除和/或替换元素
  • 不返回已删除的元素,返回一个新数组,该新数组由 start 之前的所有元素、item1item2、...、itemN,以及 start + deleteCount 之后的所有元素组成
  • 不产生稀疏数组,如果原始数组是稀疏的,新数组中空槽会被替换成undefined

语法

语法与splice()方法一样

const arr = [1, 2, 3, 5];
const toSpliced1 = arr.toSpliced(1);
// arr: [1, 2, 3, 5]
// spliced1: [1]

const toSpliced2 = arr.toSpliced(1, 0, 8);
// toSpliced2: [2, 8, 3, 5]

const toSpliced3 = arr.toSpliced(2, 1);
// toSpliced3: [1, 2, 5]

8. Array.prototype.concat()

返回值

  • 不更改原数组,返回新数组,新数组将首先由调用它的对象中的元素填充
  • 用于合并两个或多个数组
const letters = ["a", "b", "c"];
const numbers = [1, 2, 3];

const alphaNumeric = letters.concat(numbers);
console.log(alphaNumeric);
// results in ['a', 'b', 'c', 1, 2, 3]

9. Array.prototype.copyWithin()

返回值

  • 浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度

语法

copyWithin(target)
copyWithin(target, start)
copyWithin(target, start, end)
  • target:序列开始替换的目标位置,以0为起始的下标表示,且将被转换为整数
    • target < 0,则实际的目标位置是:target + array.length
    • target < -array.length, 则实际的目标位置为0
    • target > array.length, 则不会拷贝任何内容
    • target > start, 则复制只会持续到array.length结束(copyWithin()永远不会扩展数组)
  • start(可选):要复制的元素序列的起始位置,以0为其实的下标
    • start < 0,则实际的起始位置是:start + array.length
    • start < -array.length, 则实际的起始位置为0
    • target > array.length, 则不会拷贝任何内容
  • end(可选):要复制的元素序列的结束位置,以0为起始的下标。copyWithin()将会拷贝到该位置,但不包括end这个位置的元素
    • end < 0,则实际的结束位置是:end + array.length
    • end < -array.length, 则实际的结束位置为0
    • 如省略end或end >= array.length, 则实际的结束位置默认为array.length,这会导致知道数组末尾的所有元素都会被复制
    • end < start,则不会拷贝任何内容
console.log([1, 2, 3, 4, 5].copyWithin(-2));
// [1, 2, 3, 1, 2]

console.log([1, 2, 3, 4, 5].copyWithin(0, 3));
// [4, 5, 3, 4, 5]

console.log([1, 2, 3, 4, 5].copyWithin(0, 3, 4));
// [4, 2, 3, 4, 5]

console.log([1, 2, 3, 4, 5].copyWithin(-2, -3, -1));
// [1, 2, 3, 3, 4]