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对象中prop1和prop2的值未知(它们来自您没有为我们定义的变量someVal和someOtherVal)。
然后,该行添加另一个指向另一个对象的变量:
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 |----+
+------------------+
这篇关于将多个键指向相同的值--它们指向相同的位置吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:将多个键指向相同的值--它们指向相同的位置吗?
基础教程推荐
- 最佳动态 JavaScript/JQuery 网格 2022-01-01
- CORS:当凭据标志为真时,无法在 Access-Control-Allow-Origin 中使用通配符 2022-01-01
- 从快速中间件中排除路由 2022-01-01
- HTML5 画布调整为父级 2022-01-01
- 使用 jQuery 在悬停时交换 DIV 类 2022-01-01
- 即使每次插入第一个输入的值不同,第二个输入仍显示相同的输入值 2022-01-01
- 当木偶师打开Chrome时,不能使用Chrome扩展 2022-01-01
- 带角度的选项卡:仅使用 $http 在单击时加载选项卡 2022-01-01
- 在 Javascript 中使用 Fetch API 上传文件并显示进度 2022-01-01
- 逻辑运算符 ||在 javascript 中,0 代表 Boolean false? 2022-01-01
