【发布时间】:2019-05-28 22:01:36
【问题描述】:
请帮助我,我真的对 javascript 的 slice() 感到困惑。我已经阅读了Array.prototype.slice() 的文档。它说:
对于对象引用(而不是实际对象),切片将对象引用复制到新数组中。原始数组和新数组都引用同一个对象。如果引用的对象发生更改,则更改对新数组和原始数组均可见。
在这段代码中,我将slice() 用于实际对象,但它仍然返回一个引用
var arObj = [
{ 'name': 'Jon', 'age': 24 },
{ 'name': 'Mark', 'age': 32 },
{ 'name': 'Kacy', 'age': 22 }
];
// use splice to copy array of objects into second variable
var ar2 = arObj.slice();
// modify property value in copy
ar2[1].name = 'Bill';
// view original (also modified)
console.log( arObj[1].name ); // Bill
而第二个代码却没有:
let data = this.state.data.slice(); //If you don't have the slice function, it will return a reference.
console.log(this.state.data);
data.reverse();
如果我尝试反转或更改数据的值,则 (this.state.data) 的值不会改变。这是this.state.data的结构:
【问题讨论】:
-
.reverse()不会改变数组中的任何项目,它只会改变数组本身(如果数组刚刚使用slice创建,则切片数组之外的任何内容都不会受到影响) -
因为你切片了它,它不仅仅是对
this.state.data数组的引用——你用.slice创建了一个new数组,所以重新排列了new 数组不会改变它们在原始数组中的排序方式。 -
您的原始代码正在改变数组中的 item。您的
this.state.data代码正在改变新创建的数组,而不是任何单个项目。 -
不, slice 返回一个新数组,然后您将其反转。如果你改变反转数组的元素,那么
this.state.data中的原始元素将发生改变。
标签: javascript reactjs reference slice