JavaScript变量赋值?

时间:2012-05-17 17:33:14

标签: 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个对象(图像和块)是嵌套键:值对。在第一个代码块中

theme = images[sec]; 
theme[tsec].img.src = 'images/'+theme[tsec].src+'.png';

在第二行代码中有

section = images[secnm];
result[definition] = {};
result[definition].img = section.img;

在第一个代码块之前的“images”中没有.img,其中.img被添加到“theme”中。但这似乎反映在第二块代码中看到的“图像”中。所有对象都是JavaScript中的指针吗? “结果”与“主题”与“图像”的“块”具有相同的关系吗?如果我从“主题”中删除元素会怎样,这会反映在“图像”中吗?

4 个答案:

答案 0 :(得分:4)

使用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的任何属性是数组或对象本身,它将是一个引用。如果您没有任何对象或数组作为属性,上面的代码段就可以了。否则,您应该编写一个克隆函数并递归克隆原始的每个成员。

答案 1 :(得分:2)

  

所有对象都是JavaScript中的指针吗?

实际上,是的,虽然我相信会更普遍地说在JavaScript中一个对象是一个“引用类型”。

如果var a引用了某个对象,a已分配给var b,则b将获得a所持有的引用的副本,因此{ {1}}和a都将在内存中引用相同的对象数据。

b引用所做的更改可以从a引用中观察到。

请注意,这仍然是“按值”赋值,但复制的值是引用的值,而不是对象本身。

答案 2 :(得分:1)

您遇到此问题的原因是对象通过引用传递。有克隆对象的方法。看看其他SO帖子How do I correctly clone a JavaScript object?

答案 3 :(得分:1)

你在两种情况下改变images[sec][tsec],这是指内存中的同一个对象。只做theme = images[sec]不会复制该对象。

这种行为的一个更简单的例子就是:

var obj = {};
var obj2 = obj;

obj.a = 123;
obj2.a; // 123