看看下面的代码,谁能解释一下 JavaScript 中值是如何传递的。
function loadImages() {
for(var sec in images) {
theme = images[sec];
for(var tsec in theme) {
theme[tsec].img = new Image();
theme[tsec].img.src = 'images/'+theme[tsec].src+'.png';
}
}
}
然后在另一个函数中:
function definitionToSpriteDataMapping() {
var result = {};
for(var definition in blocks) {
var sprite = blocks[definition].sprite;
for(var secnm in images) {
section = images[secnm];
for(var spritenm in section) {
if(sprite == spritenm) {
result[definition] = {};
result[definition].img = section.img;
}
}
}
}
return result;
}
为了简单起见,我删除了一些代码,但它仍然很复杂。基本上有 2 个对象(图像和 block )是嵌套的键:值对。在第一段代码中
theme = images[sec];
theme[tsec].img.src = 'images/'+theme[tsec].src+'.png';
在第二行代码中有
section = images[secnm];
result[definition] = {};
result[definition].img = section.img;
在将.img 添加到“theme”的第一个代码块之前,“images”中没有.img。但这似乎反射(reflect)回了第二个代码块中看到的“图像”。 JavaScript 中的所有对象都像指针吗? “结果”与“ block ”的关系是否与“主题”与“图像”的关系相同?如果我从“主题”中删除一个元素,它会反射(reflect)在“图像”中吗?
最佳答案
使用 theme = images[sec]
您确实会在内存中创建一个指向该对象的指针。因此,将 img
添加到 theme
对象也会将 img
添加到该图像,因为它们是同一个对象。所以是的,result
也是如此。
更改、添加或删除以这种方式引用的对象的属性将影响实际对象。数组也是如此。
如果您不喜欢这种行为,您应该克隆该对象。您可以通过复制所有属性来克隆一个简单的对象:
var original = { name: "James", age: 73, male: true };
var clone = { };
for( var k in original )
clone[ k ] = original[ k ];
但如果 original
的任何属性是一个数组或对象本身,它将是一个引用。如果您没有任何对象或数组作为属性,上面的代码片段就可以了。否则,您应该编写一个克隆函数并递归地克隆原始文件的每个成员。
关于JavaScript 变量赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640595/