Javascript 切片方法 return 是浅拷贝吗?

Does Javascript slice method return a shallow copy?

在 Mozilla 开发人员翻译的韩语 lang 中说 'slice method' returns 一个浅拷贝的新数组。

所以我测试了我的代码。

var animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

var t = animals.slice(2,4);
console.log(t);

t[0] = 'aaa';
console.log(t);
console.log(animals);

但是,如果切片方法returns shallow array, animals 数组应更改为['ant', 'bison', 'aaa', 'duck', 'elephant'].

为什么是浅拷贝?

字符串在JavaScript中是基本类型,所以你会得到一个新的数组,里面有新的字符串。

您的测试数组应该是一个对象数组:

var animals = [{name: 'ant'}, {name: 'bison'}, {name: 'camel'}, {name: 'duck'}, {name: 'elephant'}];

var t = animals.slice(2,4);
console.log(t);

t[0].name = 'aaa';
console.log(t);
console.log(animals);

slice 不会改变原始数组。 它 return 是原始数组元素的浅表副本。

原始数组的元素被复制到 returned 数组中,如下所示:

对于对象引用(而不是实际对象),slice 将对象引用复制到新数组中。原始数组和新数组都引用同一个对象。如果引用的对象发生更改,则更改对新数组和原始数组都是可见的。

对于字符串、数字和布尔值(不是字符串、数字和布尔对象),slice 将值复制到新数组中。对一个数组中的字符串、数字或布尔值的更改不会影响另一个数组。 如果向任一数组添加新元素,则不会影响另一个数组。(source)

在你的例子中,数组由字符串组成,切片上的字符串将 return 复制到数组的新字符串,因此是一个浅拷贝。 为了避免这种情况,请使用数组的对象形式。

切片方法不会改变原始数组或字符串。它只剪切原始字符串或数组的一部分,并将其 returns 作为副本。 想要了解更多,请观看下面的视频: https://youtu.be/mUH8hPQfMbg [切片方法对初学者来说很简单]

可能您正在寻找这个。试试这个!

let animals = ['ant', 'bison', 'camel', [1, 2]];

let t = animals.slice();

t[0] = 'aaa';    // string (primitive datatype)
t[t.length-1][0] = 0;    // array (object)

console.log(t);
console.log(animals);

如果是浅拷贝-

  • 对象将反映原始位置的变化,因为它们是作为引用存储的(指向它们在堆中的地址)。
  • 原始数据类型将不会反映原始位置的变化,因为它们直接存储在调用堆栈中(在执行上下文中)。