JavaScript 数组拼接

JavaScript array concat

我有这两个数组:

    let num1 = [[1]];
    const num2 = [2, [3]];

我连接这两个并创建新数组:

    const numbers = num1.concat(num2);
    console.log(numbers);
    // results in [[1], 2, [3]]

现在我将一个新值推送到 num1:

    num1[0].push(4);
    console.log(numbers);
    // results in [[1, 4], 2, [3]]

但是如果我写:

    num1[0] = [1, 4, 5];
    console.log(numbers);
    // results in [[1], 2, [3]]

为什么将 vale 重新分配给 num1 不会反映 numbers 数组的变化但 push 方法会?

那是因为数组是 Javascript 中的对象。 JavaScript 中的对象始终是引用,因此当您将一个数组推送到另一个数组时,您实际上是在推送一个引用,而不是一个值。

连接两个数组时,它会将值(或引用)复制到新数组。

当您设置索引 0 的值时,您实际上是在替换该引用,但旧引用仍然存在于串联数组中。

num1[0] 以数组引用的值开始 [1]

numbers 复制该值,因此具有对同一数组的引用。

num1[0].push(4); 修改 该数组(您有两个引用)

num1[0] = [1, 4, 5]; 修改 num1[0] 将对原始数组的引用替换为对 全新数组的引用numbers 仍然包含对原始数组的引用。