我们可以在 JavaScript 中为不可变对象添加属性吗?

Posted

技术标签:

【中文标题】我们可以在 JavaScript 中为不可变对象添加属性吗?【英文标题】:Can we add properties to immutable object in JavaScript? 【发布时间】:2019-02-20 00:54:31 【问题描述】:

一个对象是这样的:

const obj = [name: 'Alex', age: 20, name: 'James', age: 22];

这个对象在 Immutable.js 中是不可变的。

是否可以为每个对象添加一个新键?示例:

const obj = [name: 'Alex', age: 20, city: 'New York', name: 'James', age: 20, city: 'Rome'];

【问题讨论】:

如果您只是尝试向每个对象添加属性会发生什么? "This obect is immutable from Immutable.js" - 您发布的 sn-p 不使用 immutable.js,它只是创建普通的数组和对象文字。你能发布一些创建一个真正的不可变对象的代码吗? 您的问题得到解答了吗?如果是,请标记正确答案。如果没有,请对给出的答案发表评论,并说明为什么这些答案没有回答您的问题。 【参考方案1】:

如果它是不可变的,则不是。但这没关系,您可以将所有属性复制到一个新结构中,然后以这种方式添加您需要的任何内容:

const newData = obj.map(person => (
  ...person,
  city: someLogicToDetermineCity(person)
))

function someLogicToDetermineCity(person) 
  // logic based on person
  return city

【讨论】:

【参考方案2】:

const 不会创建不变性 - 它只是意味着在创建时分配给它的 reference 以后不能更改(这只是意味着您不能为其分配新值)。

查看这些示例:

const a = 

a =  name: "peter"  // => TypeError: invalid assignment to const `a'

但是在a上分配属性是没有问题的:

const a = 

a.name = "peter"

console.log(a); // =>  "name": "peter" 

这同样适用于Array 对象:

const arr = []

arr.push(1);

arr[0].name="peter"

console.log(arr);
// [
//  
//    "name": "peter"
//  ,
//  1
// ]

【讨论】:

以上是关于我们可以在 JavaScript 中为不可变对象添加属性吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Javascript 中为不和谐机器人制作随机生成器?

图说:为什么Java中的字符串被定义为不可变的

图说:为什么Java中的字符串被定义为不可变的

python的深浅拷贝

是否可以在 keycloak 中为不同组中的用户添加不同的角色?

在 Spark 中为可变集合建模