将多个键指向相同的值--它们指向相同的位置吗?

Javascript multiple keys to the same value - Do they point to the same place?(将多个键指向相同的值--它们指向相同的位置吗?)
本文介绍了将多个键指向相同的值--它们指向相同的位置吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下简化的代码:

var obj = {
    key1 : {
            aliases: ["alias1", "alias2"],
            prop1: someVal,
            prop2: someOtherVal
        }
}
var objHashMap = {};
for(var key in obj){
    objHashMap[key] = obj[key];
    objHashMap[obj[key].aliases[0]] = obj[key];
    objHashMap[obj[key].aliases[1]] = obj[key];
}

现在objHashMap有3个条目,所有条目都指向:

{
        aliases: ["alias1", "alias2"],
        prop1: someVal,
        prop2: someOtherVal
}

我的问题是所有3个指向同一对象,还是指向该对象的3个不同副本?

推荐答案

objHashMap.key1将拥有副本obj.key。该值是对对象的引用。该值的两个副本引用相同的对象。使用obj.key1.aliases[0]obj.key1.aliases[1]的值创建两个附加属性,具有引用的副本,引用同一对象。

之后:

var obj = {
    key1 : {
            aliases: ["alias1", "alias2"],
            prop1: someVal,
            prop2: someOtherVal
        }
}

...我们在内存中有以下内容:

                +----------------+
obj: ref-1654-->|    (object)    |
                +----------------+     +-------------------+
                | key1: ref-8754 |---->|     (object)      |
                +----------------+     +-------------------+     +-------------+
                                       | aliases: ref-6549 |---->|  (array)    |
                                       | prop1: ???        |     +-------------+
                                       | prop2: ???        |     | 0: "alias1" |
                                       +-------------------+     | 1: "alias2" |
                                                                 +-------------+

也就是说,我们有一个变量obj,它包含一个值,该值告诉JavaScript引擎对象在内存中的其他位置;我已经按照上面的ref-1654说明了这一点。可以将对象引用想象为一个只对JavaScript引擎有意义的数字,就像对大量内存的索引一样。(对象引用的实际值是我们从未见过的。)

该对象有一个属性key1,它也有一个指向内存中其他位置的对象的值。该对象又有aliases对内存中对象(这次是数组)的另一个引用。aliases对象中prop1prop2的值未知(它们来自您没有为我们定义的变量someValsomeOtherVal)。

然后,该行添加另一个指向另一个对象的变量:

var objHashMap = {};
                       +----------------+
objHashMap: ref-8132-->|    (object)    |
                       +----------------+
                       |                |
                       +----------------+
<2-14]>您的for-in循环对于键"key1"只运行一次。在第一行之后:

objHashMap[key] = obj[key];

我们有:

                +----------------+
obj: ref-1654-->|    (object)    |
                +----------------+          
                | key1: ref-8754 |---------+
                +----------------+         |
                                           |
                                           |
                                           |   +-------------------+                 
                                           +-->|     (object)      |                 
                                           |   +-------------------+     +-------------+
                                           |   | aliases: ref-6549 |---->|  (array)    |
                       +----------------+  |   | prop1: ???        |     +-------------+
objHashMap: ref-8132-->|    (object)    |  |   | prop2: ???        |     | 0: "alias1" |
                       +----------------+  |   +-------------------+     | 1: "alias2" |
                       | key1: ref-8754 |--+                             +-------------+
                       +----------------+

请注意,新对象中的key1属性如何包含与原始对象中的key1属性相同的。它们指向同一对象。

那么您需要:

objHashMap[obj[key].aliases[0]] = obj[key];

...也就是

objHashMap[obj.key1.aliases[0]] = obj[key];

...因为key包含"key1",也就是说

objHashMap["alias1"] = obj[key];

...因为obj.key1.aliases[0]"alias1"。这给了我们:

                +----------------+
obj: ref-1654-->|    (object)    |
                +----------------+          
                | key1: ref-8754 |-----------+
                +----------------+           |
                                             |
                                             |
                                             |    +-------------------+                 
                                             ++-->|     (object)      |                 
                                             ||   +-------------------+     +-------------+
                                             ||   | aliases: ref-6549 |---->|  (array)    |
                       +------------------+  ||   | prop1: ???        |     +-------------+
objHashMap: ref-8132-->|     (object)     |  ||   | prop2: ???        |     | 0: "alias1" |
                       +------------------+  ||   +-------------------+     | 1: "alias2" |
                       | key1:   ref-8754 |--+|                             +-------------+
                       | alias1: ref-8754 |---+ 
                       +------------------+

然后再为此行:

objHashMap[obj[key].aliases[1]] = obj[key];

...即:

objHashMap["alias2"] = obj[key];
因为obj.key1.aliases[1]"alias2"。因此,我们的结果是:

                +----------------+
obj: ref-1654-->|    (object)    |
                +----------------+          
                | key1: ref-8754 |-----------+
                +----------------+           |
                                             |
                                             |
                                             |    +-------------------+                 
                                             +++->|     (object)      |                 
                                             |||  +-------------------+     +-------------+
                                             |||  | aliases: ref-6549 |---->|  (array)    |
                       +------------------+  |||  | prop1: ???        |     +-------------+
objHashMap: ref-8132-->|     (object)     |  |||  | prop2: ???        |     | 0: "alias1" |
                       +------------------+  |||  +-------------------+     | 1: "alias2" |
                       | key1:   ref-8754 |--+||                            +-------------+
                       | alias1: ref-8754 |---+|
                       | alias2: ref-8754 |----+ 
                       +------------------+

这篇关于将多个键指向相同的值--它们指向相同的位置吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)