Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象分配和结构共享_Javascript_Javascript Objects_Immutability - Fatal编程技术网

Javascript对象分配和结构共享

Javascript对象分配和结构共享,javascript,javascript-objects,immutability,Javascript,Javascript Objects,Immutability,我一直在试验javascript对象的不变性概念。我想知道下面的代码示例是否实现了我所认为的“结构共享”(请参阅:) objectNext现在是{key1:1,Key2:4},objectFirst保持不变。但是key1被复制了吗?或者,它们现在本质上是两个对象共享的对key1在内存中位置的引用吗 我基本上只是问这种方法是否实现了某种“结构共享”?我们可以看到,如果不是这样,那么它将导致严重的内存膨胀。不,这不是事实。您可以通过更改objectFirst.key1来验证这一点,并查看它是否反映在

我一直在试验javascript对象的不变性概念。我想知道下面的代码示例是否实现了我所认为的“结构共享”(请参阅:)

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


我基本上只是问这种方法是否实现了某种“结构共享”?我们可以看到,如果不是这样,那么它将导致严重的内存膨胀。

不,这不是事实。您可以通过更改
objectFirst.key1
来验证这一点,并查看它是否反映在
objectNext
中。这两个对象都具有不同的
key1
属性。虽然人们永远不知道内部发生了什么,但不存在任何可见的属性共享。对于结构共享,您需要一个树状的数据结构。最简单的树是一元树,其中每个节点都有一个子节点或没有子节点。你猜对了,我说的是一个单链表。当您实现这样一个列表时,您会注意到预结束是一个廉价的操作,而追加是一个昂贵的操作。因此,平衡树用于后者。不,这不是那个。您可以通过更改
objectFirst.key1
来验证这一点,并查看它是否反映在
objectNext
中。这两个对象都具有不同的
key1
属性。虽然人们永远不知道内部发生了什么,但不存在任何可见的属性共享。对于结构共享,您需要一个树状的数据结构。最简单的树是一元树,其中每个节点都有一个子节点或没有子节点。你猜对了,我说的是一个单链表。当您实现这样一个列表时,您会注意到预结束是一个廉价的操作,而追加是一个昂贵的操作。因此,后者采用平衡树。
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)