【发布时间】:2014-12-22 09:40:57
【问题描述】:
我认为对象是作为引用传递的。但是当我删除b时,它仍然存在于c中。请看这个例子:
这第一部分对我来说很有意义,因为它是通过引用传递的:
var a = {b: {val:true}};
a.c = a.b;
a.b.val = 'rawr';
console.log(uneval(a)); // outputs: "({b:{val:"rawr"}, c:{val:"rawr"}})"
现在这部分对我来说没有意义:
var a = {b: {val:true}};
a.c = a.b;
a.b.val = 'rawr';
delete a.b;
console.log(uneval(a)); // outputs: "({c:{val:"rawr"}})"
所以b 属性被删除,但c 属性将属性保存到删除之前引用的内容。这是javascript中的错误吗?
编辑: 感谢大家的回复!所以它不是错误,而且这种行为实际上非常好,它允许人们在保留对象的同时更改“键”/“属性”名称! :)
【问题讨论】:
-
谢谢阿瓦尔!我会重新命名它。
-
P.S.如果您使用调试器,最好只使用
console.log(a)而不是console.log(uneval(a)),因为它会向您显示属性和其他有用的调试内容(firebug 和 chrome 控制台)。 -
"我认为对象是作为引用传递的。" JavaScript 总是按值传递,就像 Java 一样。
-
谢谢大家。是的,关于
console.log,你是对的,但我在 uneval 中做了只是为了在这个例子中显示输出。感谢您提供按值传递的说明。
标签: javascript pass-by-reference