【发布时间】:2018-12-15 12:35:55
【问题描述】:
在 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(通过引用传递)......
对于上面的例子,这是我脑海中视觉/概念上发生的事情:
-
extend函数将密钥
hola深度复制到obj中:obj = {hello: [2], hola: TBD} ]btw - obj 是否只为这个对象存储一个内存地址?
-
然后我怀疑 hola 将内存地址存储为
[4]的值(所以此时我怀疑 obj 会是obj = {你好:[2],你好:#0x93490234}
这就是为什么我完全期望在 obj 下看到 5。你能告诉我我上面的可视化有什么问题吗?
最后,通过解释,你能指出上面的例子与下面的例子有什么不同吗(我理解下面的例子是如何/为什么工作的——只是不是上面的例子,想听听为什么下面的例子有效,以上没有)。
var obj2 = {hola: [4]};
var obj = obj2;
obj2.hola = 5; //console.log(obj) will say that hola equals 5
【问题讨论】:
-
JavaScript 中的所有参数始终按值传递。 Read this 解释一下。
-
感谢@ScottMarcus - 我阅读了您链接中的解释,但对我没有太大帮助。我的示例中没有函数/没有参数。我不确定它与我的问题有何关系 - 任何指导都将不胜感激......
-
您的示例中确实有一个函数
.extend(),并且您正在向它传递参数。这些参数是按值传递的。 -
_.extend复制obj2拥有当时的属性到obj。更改obj2之后 对obj没有影响。 -
我只是想帮助你理解在 JavaScript 中没有通过引用传递这样的东西。
标签: javascript pass-by-reference