为什么这样做?清除用作表单的{j}对象

时间:2015-06-30 18:33:48

标签: javascript angularjs

拿这个javascript对象:

dog = {
   owner: 'mike'
   food: 'kibbles'
   breed: {color: 'brown'
           type: 'corgie'
           gender:'f'  
          }
   neuter:'y'
   spay:'no'
   name:'Sparky'
}

我提交了这些数据,然后我想在成功时清除它。 如果我写:

dog = {};

田地里没有任何事情发生。

但是,如果我将整个对象更改为:

dog.info = {
   owner: 'mike'
   food: 'kibbles'
   breed: {color: 'brown'
           type: 'corgie'
           gender:'f'  
          }
   neuter:'y'
   spay:'no'
   name:'Sparky'
}

然后我通过重新初始化对象来清除对象:

dog.info = {};

有效。 我用它来清除服务内部的角形。 有谁知道为什么会这样?一如既往地非常感谢您的帮助。 谢谢。

1 个答案:

答案 0 :(得分:2)

这在很大程度上取决于您使用dog的准确程度,而且由于您没有提供,我将自己编写示例。

这与对象存储在变量中的方式有​​关。请看以下示例:

var dog = {name: 'bob'};
var x = dog;
console.log(x.name); // 'bob'
x.name = 'george';
console.log(x.name); // 'george'
console.log(dog.name); // 'george'
dog = {name: 'frank'}; // dog and x now hold two different objects!
console.log(x.name); // 'george'
console.log(dog.name); // 'frank'

当我将x设置为dog时,x存储了与dog相同的对象,因此当我修改它时,dog也被修改了。但是,当我用新对象覆盖dog时,x仍然包含旧对象,而不是更新到新对象。

通过使用dog.info并且永远不会覆盖dog,您保留了原始对象,因此所有内容仍然引用了正在更新的对象。

var dog = {info: {name: 'bob'}};
var x = dog;
console.log(x.info.name); // 'bob'
x.info.name = 'george';
console.log(x.info.name); // 'george'
console.log(dog.info.name); // 'george'
dog.info = {name: 'frank'}; // dog and x still hold the same object.
console.log(x.info.name); // 'frank'
console.log(dog.info.name); // 'frank'