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个不同的对象副本?
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是未知的(他们来自变量someVal和someOtherVal,你有没有为我们定义了).
然后这一行添加另一个指向另一个对象的变量:
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 |----+
+------------------+