Javascript切片方法是否返回浅层副本?

时间:2017-12-10 11:25:57

标签: javascript arrays slice shallow-copy

在一位Mozilla开发者中,翻译过的韩语lang说' slice方法'返回一个浅层复制的新数组。

所以我测试了我的代码。

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);

但是,如果slice方法返回浅层数组,则应该使用[' ant',' bison',' aaa',&#39更改animals数组;鸭子',' elephant']。

为什么它是浅拷贝?

4 个答案:

答案 0 :(得分:8)

slice不会改变原始数组。 它返回原始数组中元素的浅表副本。

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

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

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

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

答案 1 :(得分:1)

字符串是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);




答案 2 :(得分:0)

slice方法不会更改原始数组或字符串。它仅剪切原始字符串或数组的一部分,并将其作为副本返回。 要了解更多信息,请查看下面的视频: https://youtu.be/mUH8hPQfMbg [绝对入门者可以轻松使用切片方法]

答案 3 :(得分:0)

也许你正在寻找这个。试试这个!

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);

如果是浅拷贝-

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