【问题标题】:slice() to the array of object didn't return a reference?对象数组的 slice() 没有返回引用?
【发布时间】: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的结构:

https://i.stack.imgur.com/94emV.png

【问题讨论】:

  • .reverse() 不会改变数组中的任何项目,它只会改变数组本身(如果数组刚刚使用slice 创建,则切片数组之外的任何内容都不会受到影响)
  • 因为你切片了它,它不仅仅是对this.state.data数组的引用——你用.slice创建了一个new数组,所以重新排列了new 数组不会改变它们在原始数组中的排序方式。
  • 您的原始代码正在改变数组中的 item。您的this.state.data 代码正在改变新创建的数组,而不是任何单个项目。
  • 不, slice 返回一个新数组,然后您将其反转。如果你改变反转数组的元素,那么 this.state.data 中的原始元素将发生改变。

标签: javascript reactjs reference slice


【解决方案1】:

感谢大家对我的帮助,并为我的愚蠢错误感到抱歉。 reverse() 函数不会影响原始数组。只有当你改变了引用数组中一个或多个项目的值时,它才会受到影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多