javascript - 在回调 : why. 中更改对象时出现奇怪的行为 ..?

标签 javascript object

这段代码:

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);
  });

由于 dCHANGE() 中被重写,所以确实应该将 {} 显示为 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"} 

http://jsfiddle.net/2DxzT/

关于javascript - 在回调 : why. 中更改对象时出现奇怪的行为 ..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668953/

相关文章:

javascript - 我可以将 HTML 元素合并到对象吗?

javascript - 多个谷歌分析来跟踪 AJAX 请求

php - file_get_contents 到 json 变量 - twitter 模块

python - 我可以在不在 Python 中创建新类的情况下覆盖类函数吗?

javascript - Multer 与 Express.js

通过返回 false 和通过类选择的表单问题的 JavaScript 验证

javascript - 更改嵌套对象的父子相关 ID

javascript - 如何使用 JavaScript (lodash) 深度映射对象键?

javascript - jquery .css() 返回对象对象?

java - 如何打印我的 Java 对象而不得到 "SomeType@2f92e0f4"?