JavaScript 变量赋值?

标签 javascript pointers reference

看看下面的代码,谁能解释一下 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/

相关文章:

php - Ajax : not load jquery plugin when ajax response

javascript - Kendo AutoComplete + AngularJS + 对象数组

java - 为什么这里的 super 引用的地址与引用变量 sc1 引用的地址相同?

c++ - 向项目添加类后对 'main' 的 undefined reference

python - 如何使两个目录条目始终引用相同的浮点值

javascript - 是否有用于在 JavaScript 中定义解析器的框架?

javascript - 动态添加javascript

c++ - BST - 节点神秘地被分配到错误的一侧

c++ - 在 C++ 中将派生类对象分配和访问到基类 "pointer to pointer"对象

c - 如何在函数之间更改指针值