首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript不可变性与局部数组

Javascript不可变性与局部数组
EN

Stack Overflow用户
提问于 2021-06-26 17:56:00
回答 1查看 68关注 0票数 2

更新:我现在了解到,在下面的代码中,当我遍历aggregateData时,我正在对pagedData数组进行变异。

  1. 我想知道我怎么能做到这一点而不变异?
  2. 一般来说,当试图在代码库中尽可能地尊重不可变性时,在变异本地定义的数组时(就像我在我的示例中所做的那样),可能会有多大的关注?由于数组是在本地定义的,我想知道如何对数组进行变异才能真正产生任何负面影响?
代码语言:javascript
运行
复制
const pagedData = [
  {data: ["val1", "val2"], nextPage: 2},
  {data: ["val3", "val4"], nextPage: 3},
  {data: ["val5", "val6"]}
];

const aggregator = () => {
  let aggregateData = [];
  let hasNextPage;
  let page = 1;

  do {
    const { data, nextPage } = pagedData[page - 1];
    aggregateData = [...aggregateData, ...data];
    page = nextPage;
    hasNextPage = nextPage;
  } while (hasNextPage);

  return aggregateData;
}

console.log(aggregator());

/* output: ["val1", "val2", "val3", "val4", "val5", "val6"] */
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-26 18:39:16

不变性有时有助于减少捕获错误的难度,但这可能并不总是必需的,也不是理想的情况。

什么是不变的?

不改变价值意味着不变性。在Javascript,数组和对象是可变的。.

不变性的例子:

代码语言:javascript
运行
复制
let arr = ['John', 'Alice'];

// Adding element is mutating
arr.push('Oliver');

// Updating data is mutating
arr[1] = 'Lily'

许多其他函数可以对这个数组进行变异。更多这里

  • copyWithin
  • 填充
  • 流行
  • 反转
  • 移位
  • 排序
  • 接合
  • 不移位

另外,请注意,将数组或对象定义为const并不能保证不可变性。例如:

代码语言:javascript
运行
复制
const obj = {
  name: 'foo'
}
// update name
obj.name = 'bar';

console.log(obj);

代码语言:javascript
运行
复制
const arr = ['foo'];

// push new item
arr.push('bar');

console.log(arr);

现在回答你的问题。传动员什么时候可以变异,什么时候不是?

如果我们有这个数组,当这个数组中的任何数据发生变化时,它就会失去不可变性。

代码语言:javascript
运行
复制
let arr = ['Obito', 'Sasuke'];
let sameReferenceArray = arr;

console.log(arr === sameReferenceArray);

// here the original array did not mutate 
let newArray = [...arr, 'Madara'];
console.log(arr === sameReferenceArray);

// but here it did mutate as the new array is assigned back to arr
arr = [...arr, 'Madara'];
console.log(arr === sameReferenceArray);

有更多的例子说明哪些方法会发生变异,哪些方法不会发生变化,随着时间的推移,您将了解到它们。

编辑突变如何会产生负面影响?

代码语言:javascript
运行
复制
// simple example demostrating negative impact of mutataion
const obj = { name: "foo" };
const arr = [obj, obj]

console.log(arr);

// Mutating first element
arr[0].name = "bar";

console.log("Contents after mutation", arr);

正如您所看到的,我们最终更新了两个对象,尽管我们在索引0处更新了一个对象。

现在我要传播和变异:

代码语言:javascript
运行
复制
const obj = { name: "foo" };
const arr = [{...obj}, {...obj}]

console.log(arr);

// Mutating first element
arr[0].name = "bar";

console.log("Contents after mutation", arr);

现在只有预期的元素发生了变异。

还有更多的事情要做。一般来说,如果你已经开始学习的话,不变性不应该是一个很大的问题。但知道这一点当然有帮助。

例如,在React状态下不应该发生变异(原因)

最后,关于如何更新“聚合数据”。

代码语言:javascript
运行
复制
const aggregator = () => {
  let aggregateData = [];
  let hasNextPage;
  let page = 1;

  do {
    const { data, nextPage } = pagedData[page - 1];
    aggregateData = [...aggregateData, ...data];
    page = nextPage;
    hasNextPage = nextPage;
  } while (hasNextPage);

  return aggregateData;
}

因为您将数据预先预置到数组中,所以无论如何都会对其进行变异。你可以做spreadpush什么的。这一切都很好,因为数组是在函数中本地创建并返回的。

例如,它可能是一个问题:

代码语言:javascript
运行
复制
const aggregator = (aggregateData) => {
  for (const i = 0; i < 5; i++)
    aggregateData = [...aggregateData, i];

  return aggregateData;
}

const example = () => {
  let arr = [];
  let data = aggregator(arr);
  // if this array is passed to couple other functions too and mutated then it will get hard to track. This is where the issue can occur

}

example();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68145005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档