在一位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']。
为什么它是浅拷贝?
答案 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);
如果是浅拷贝-