【问题标题】:Javascript Object Assign and Structural SharingJavascript 对象分配和结构共享
【发布时间】:2017-10-04 14:43:13
【问题描述】:

我一直在用 JavaScript 对象试验不变性的概念。我想知道以下代码示例是否实现了我认为所谓的“结构共享”(请参阅​​:https://www.youtube.com/watch?v=e-5obm1G_FY&start=1123)。

const objectFirst = {
  key1: 1,
  key2: 2
}

const updateObject = (lastObject) => {
  const updatedObject = {...lastObject, ...{ key2: 4 }}  // Object.assign({}, lastObject, { key2: 4 })
  return updatedObject
}

const objectNext = updateObject(objectFirst)

objectNext 现在是 { key1: 1, Key2: 4 } 并且 objectFirst 没有改变。但是 key1 是否被复制了?或者,它们现在本质上是对 key1 在两个对象共享的内存中的位置的引用吗?

我基本上只是在问这种方法是否实现了某种“结构共享”?可以看出,如果不是这种情况,就会导致显着的内存膨胀。

【问题讨论】:

  • 不,这不是那个。您可以通过更改objectFirst.key1 来验证它是否反映在objectNext 中。
  • 两个对象都有不同的key1 属性。没有任何可见的财产共享,尽管人们永远不知道内部发生了什么。
  • 对于结构共享,您需要一个树状数据结构。最简单的树是一元树,其中每个节点都有一个子节点或没有子节点。你猜对了,我说的是一个单链表。当你实现这样一个列表时,你会注意到前置是一种廉价的操作,而追加是一种昂贵的操作。因此,平衡树用于后者。

标签: javascript javascript-objects immutability


【解决方案1】:
console.log(objectFirst['key1'] === objectNext['key1']); // true 

console.log(objectFirst['key2'] === objectNext['key2']); // false

这意味着objectFirstobjectNext 共享key1 属性。

【讨论】:

  • 我不这么认为,因为key1不是参考值
【解决方案2】:

不,因为 1 在objectFirst 上存储为一个简单值,而不是对对象的引用,所以当您执行{...objectFirst} 时,您会将objectFirst.key1 的值复制到objectNext.key1

但是,如果objectFirst.key1 是一个对象,那么浅拷贝将复制对象引用而不是创建一个新对象。因此,objectFirst.key1objectNext.key2 将引用同一个对象。

const objectFirst = {
    key1: 1,
    key2: 2,
    sharedObject: {foo: 'original string'} 
}
// we make a shallow copy with a different key2 value.
const objectSecond = {...objectFirst, key2: 4};

// changing a value in objectSecond doesn't affect objectFirst
objectSecond.key1 = 100;
console.log(objectFirst.key1); // 1

// but sharedObject is shared
objectSecond.sharedObject.foo = "new string";
console.log(objectFirst.sharedObject); // {foo: "new string"}

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 2019-08-07
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多