首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript引用在对象中使用扩展(underscore.js库)

Javascript引用在对象中使用扩展(underscore.js库)
EN

Stack Overflow用户
提问于 2018-07-06 22:11:28
回答 1查看 75关注 0票数 0

在Javascript中,当我在underscore.js库中使用扩展函数时.请有人从概念上或视觉上向我描述在内存方面后端发生了什么吗?下面的例子是:

代码语言:javascript
复制
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(通过参考).

对于上面的例子,下面是我的脑海中在视觉/概念上正在发生的事情:

  1. 扩展函数将键hola深深地复制到obj中: obj = {hello: 2,hola: TBD} ]btw -是obj只存储了这个对象的一个内存地址吗?
  2. 然后我怀疑hola将内存地址存储到[4]的值(因此,在这一点上,我怀疑obj将是 obj = {hello: 2,hola:#0x93490234}

这就是为什么我完全希望看到一个5下的obj。你能告诉我上面的影像有什么问题吗?

最后,通过解释,您能否指出上面的示例与下面的示例有何不同(我理解下面的示例如何/为什么工作-只是上面的示例不工作,您想知道为什么下面的示例和上面的示例不工作)。

代码语言:javascript
复制
var obj2 = {hola: [4]};
var obj = obj2;
obj2.hola = 5; //console.log(obj) will say that hola equals 5
EN

回答 1

Stack Overflow用户

发布于 2018-07-06 22:52:39

也许这会有帮助:

让我们首先区分两个概念:值、和绑定。值是一段数据,如字符串、数字、布尔值、对象等。每个值都存储在内存中,并有一个地址。

绑定就像保存地址的容器或标签。

  • 当将值赋值给绑定时,我们将分配值的地址。
  • 当访问绑定时,我们得到存储在该地址上的值。

示例:

代码语言:javascript
复制
var a = 42;

a是一个绑定,42是一个值。假设42存储在0x1的内存中,那么a实际上保存了地址0x1

当我们试图读取值时,例如:

代码语言:javascript
复制
console.log(a);

我们需要查看address 0x1以获得实际值。

现在,当我们“将一个绑定分配到另一个绑定”(即bar = foo )时会发生什么?

代码语言:javascript
复制
var foo = 42; // 0x2
var bar = foo;

42存储在0x2。所以foo保存了地址0x2。当我们将一个绑定分配给另一个绑定时,我们只需复制绑定所保存的地址。因此,在var bar = foo;之后,foobar都持有地址0x2。如果我给foo分配了一个新的值,例如。

代码语言:javascript
复制
foo = 21;

然后我让foo持有一个新地址(例如0x3)。

这不会更改bar 持有的.的地址。

同样的情况也适用于对象属性。

可变值

现在您可能会想,“为什么foobar在下面的示例中都会发生变化:

代码语言:javascript
复制
var foo = [42];
var bar = foo;
foo.push(21);
// bar also has [42, 21]

让我们假设[42]存储在内存位置0x4

下面是它与前面示例的不同之处:

我们没有为foo**.** 分配新的值

相反,我们通过0x4引用数组(at address foo )并对其进行变异。可变值是可以在适当位置更改的值,即该内存位置上的位可以更改。

调用foo.push之后,foo仍然保存地址0x4bar也一样。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51218225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档