这段代码:
function CHANGE(d, cb){
d.three = 3;
d = {};
console.log("d was changed into:");
console.log(d);
cb();
}
var d = { one: 1, two: 2 };
CHANGE(d, function(){
console.log("d after the callback is: ");
console.log(d);
});
由于 d
在 CHANGE()
中被重写,所以确实应该将 {}
显示为 d
。然而,结果很奇怪:
d was changed into:
{}
d after the callback is:
{ one: 1, two: 2, three: 3 }
因此,d
添加了属性 three
。没关系。然后它被分配了一个空对象 {}
。
我不知道该怎么想。
在回调中添加一个额外的属性(三
),很好。
然后对象被重写。美好的。打印输出显示该对象确实被重写了。
然后,在回调中,它显示具有额外 three
属性的对象...?!?
如果它没有改变,或者被重写,它将是一致的。但是……一半变了……?
其实不需要用回调来显示这个。即使这样也有同样的问题:
function CHANGE( o ){
o.three = 3;
o = {};
}
var d = { one: 1, two: 2 };
CHANGE(d);
console.log("d after the function is: ");
console.log(d);
这里 d
又是包含 three
的完整对象。
那么,我不能完全更改对象引用但可以更改属性的任何特定原因...?
雇佣兵。
最佳答案
d = {};
这会将您的变量重新定义为一个新对象,因此您会丢失旧的引用。这意味着原始文件在此之后不会被更改。
编辑:
如果你想清除一个现有对象的属性并重新分配一些其他的,你可以使用这个:
var a = {some:"stuff", other: "stuff"};
function clearProperties(obj) {
for (var i in obj) {
delete obj[i];
}
}
console.log(a);
clearProperties(a);
a.newStuff = "stuff";
console.log(a);
输出:
Object {some: "stuff", other: "stuff"} fiddle.jshell.net:28
Object {newStuff: "stuff"}
关于javascript - 在回调 : why. 中更改对象时出现奇怪的行为 ..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668953/