Javascript多个键到相同的值 - 他们指向同一个地方吗?

TBE*_*TBE 0 javascript javascript-objects

我有以下简化代码:

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];
}
Run Code Online (Sandbox Code Playgroud)

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

{
        aliases: ["alias1", "alias2"],
        prop1: someVal,
        prop2: someOtherVal
}
Run Code Online (Sandbox Code Playgroud)

我的问题是天气全部3点到同一个对象,还是指向3个不同的对象副本?

T.J*_*der 6

objHashMap.key1将有一个副本中的价值obj.key.该值是对象的引用.该值的两个副本都指向同一个对象.在您使用的值obj.key1.aliases[0],并obj.key1.aliases[1]创建两个附加属性,其具有参考的副本,指的是同一个对象.

在这之后:

var obj = {
    key1 : {
            aliases: ["alias1", "alias2"],
            prop1: someVal,
            prop2: someOtherVal
        }
}
Run Code Online (Sandbox Code Playgroud)

......我们在记忆中有这个:

                +----------------+
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另一个在存储器参考的对象(在此时间阵列).的值prop1,并prop2在与对象aliases是未知的(他们来自变量someValsomeOtherVal,你有没有为我们定义了).

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

var objHashMap = {};
Run Code Online (Sandbox Code Playgroud)
                       +----------------+
objHashMap: ref-8132-->|    (object)    |
                       +----------------+
                       |                |
                       +----------------+

for-in对于密钥,您的循环只运行一次"key1".第一行之后:

objHashMap[key] = obj[key];
Run Code Online (Sandbox Code Playgroud)

我们有:

                +----------------+
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];
Run Code Online (Sandbox Code Playgroud)

......也就是说

objHashMap[obj.key1.aliases[0]] = obj[key];
Run Code Online (Sandbox Code Playgroud)

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

objHashMap["alias1"] = obj[key];
Run Code Online (Sandbox Code Playgroud)

......因为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];
Run Code Online (Sandbox Code Playgroud)

......这是:

objHashMap["alias2"] = obj[key];
Run Code Online (Sandbox Code Playgroud)

......因为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 |----+ 
                       +------------------+

  • 我非常喜欢ASCII方案TJ (3认同)