在Javascript中,当我在underscore.js库中使用扩展函数时.请有人从概念上或视觉上向我描述在内存方面后端发生了什么吗?下面的例子是:
var obj = {hello: [2]};
var obj2 = {hola: [4]};
_.extend(obj, obj2)
obj2.hola = 5;
console.log(obj) // hola still has a value of `[4]`我的问题是,如果我console.log(obj),由于某种原因,hola仍然具有[4]的值。我完全认为我会得到值5(通过参考).
对于上面的例子,下面是我的脑海中在视觉/概念上正在发生的事情:
hola深深地复制到obj中:
obj = {hello: 2,hola: TBD} ]btw -是obj只存储了这个对象的一个内存地址吗?[4]的值(因此,在这一点上,我怀疑obj将是
obj = {hello: 2,hola:#0x93490234}这就是为什么我完全希望看到一个5下的obj。你能告诉我上面的影像有什么问题吗?
最后,通过解释,您能否指出上面的示例与下面的示例有何不同(我理解下面的示例如何/为什么工作-只是上面的示例不工作,您想知道为什么下面的示例和上面的示例不工作)。
var obj2 = {hola: [4]};
var obj = obj2;
obj2.hola = 5; //console.log(obj) will say that hola equals 5发布于 2018-07-06 22:52:39
也许这会有帮助:
让我们首先区分两个概念:值、和绑定。值是一段数据,如字符串、数字、布尔值、对象等。每个值都存储在内存中,并有一个地址。
绑定就像保存地址的容器或标签。
示例:
var a = 42;a是一个绑定,42是一个值。假设42存储在0x1的内存中,那么a实际上保存了地址0x1。
当我们试图读取值时,例如:
console.log(a);我们需要查看address 0x1以获得实际值。
现在,当我们“将一个绑定分配到另一个绑定”(即bar = foo )时会发生什么?
var foo = 42; // 0x2
var bar = foo;42存储在0x2。所以foo保存了地址0x2。当我们将一个绑定分配给另一个绑定时,我们只需复制绑定所保存的地址。因此,在var bar = foo;之后,foo和bar都持有地址0x2。如果我给foo分配了一个新的值,例如。
foo = 21;然后我让foo持有一个新地址(例如0x3)。
这不会更改bar 持有的.的地址。
同样的情况也适用于对象属性。
可变值
现在您可能会想,“为什么foo和bar在下面的示例中都会发生变化:
var foo = [42];
var bar = foo;
foo.push(21);
// bar also has [42, 21]让我们假设[42]存储在内存位置0x4。
下面是它与前面示例的不同之处:
我们没有为foo**.** 分配新的值
相反,我们通过0x4引用数组(at address foo )并对其进行变异。可变值是可以在适当位置更改的值,即该内存位置上的位可以更改。
调用foo.push之后,foo仍然保存地址0x4,bar也一样。
https://stackoverflow.com/questions/51218225
复制相似问题