JavaScript 变量赋值
JavaScript variable assignment?
看看下面的代码,有人可以解释一下在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;
在将.img添加到"主题"的第一个代码块之前,"图像"中没有.img。但这似乎反映回"图像"中,如第二代码块所示。所有对象都像 JavaScript 中的指针吗?"结果"与"块"的关系是否与"主题"与"图像"的关系相同?如果我从"主题"中删除一个元素,它会反映在"图像"中吗?
使用 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 中的指针吗?
实际上,是的,尽管我相信更普遍地说,在JavaScript中,对象是一种"引用类型"。
如果var a
引用了一个对象,并且a
被分配给var b
,b
将获得a
持有的引用的副本,因此a
和b
都将引用内存中的相同对象数据。
从a
参照所做的更改可以从b
参照中观察到。
请注意,这仍然是"按值"赋值,但复制的值是引用的值,而不是对象本身。
您遇到这种情况的原因是对象是通过引用传递的。 有多种方法可以克隆对象。看看这篇其他 SO 帖子 如何正确克隆 JavaScript 对象?
这两种情况下,您都在更改images[sec][tsec]
,这指的是内存中的同一对象。仅执行theme = images[sec]
不会复制对象。
此行为的一个更简单的例子是:
var obj = {};
var obj2 = obj;
obj.a = 123;
obj2.a; // 123
- Javascript变量赋值|
- 如何在javascript中为全局变量赋值
- 未设置变量的赋值| jQuery的作用是什么
- 我可以在javascript中的回调函数中为变量赋值吗
- 如何在不赋值数组变量的情况下读取数组数据
- JavaScript 变量赋值的行为令人惊讶
- 为什么 Javascript 在变量赋值时将 null 转换为字符串
- JavaScript: 变量赋值 in for 语句 |在前面或里面
- 在 IF Javascript 中赋值变量
- 变量“this”上下文在重新赋值变量后未更新
- 在赋值变量中查找值
- 赋值变量新值以更改元素节点值
- 给对象赋值.变量动态形成
- 如何在函数内部使用赋值变量,在函数之外
- Javascript赋值变量if为nil
- 从可能未定义的字段中赋值变量
- 量角器在赋值变量时抛出错误
- 用$. getjson赋值变量
- jQuery使用click()赋值变量
- mongodb在赋值变量时打印结果