js obj对象如何清空

var a = {"a":1111};
var b = {"b":2222};
var c = a;

这时改 c对象中的值,a对象也会变,如:c.a=3333; 这时a对象会变为{"a":3333}

那我要怎么把c对象变成{},同时a对象也能变为{}

阅读 20.8k
7 个回答

非得搞这么蛋疼的需求的话,可以这么搞

for(let key in a) {
    delete a[key]
}

不知道为什么会这样做,所以,我也不知道为啥会这样回答??
var a=c={}

JS 不能检测变量赋值,所以只能 delete 清空属性了。

但用 with 黑魔法的话可以变相实现这种效果,很多响应式框架就是这个原理,手写不建议:

var _o = {
  _v: {a: 1111},
  get a () { return this._v },
  set a (v) { return this._v = v },
  get c () { return this._v },
  set c (v) { return this._v = v }
}

with (_o) {
  console.log(a) // {a: 1111}
  c = {}
  console.log(a) // {}
}

只能想到是通过delete把c上的所有属性删除了。。

感觉提主要的是这个答案:

var c = Object.assign({}, a);

JavaScript没有真正的指针变量。

T tmp = {}
T *a = &tmp;
T *c = &tmp;


c['key'] = 'value';
// 是
// tmp['key'] = 'value';

// 但:
c = {}
// 你以为是:
// tmp = {}

// 其实是:
// tmp2 = {}
// c = &tmp2;

首先明确概念,JavaScript数据类型分两种:
1)基本数据类型---Number、String 、Boolean、Null、Undefined,存储于栈内存中,基本类型赋值时,对值进行了副本拷贝,如图中a、b两者独立互不影响;
2)引用数据类型---Object,存储于堆内存中,引用类型赋值时,对引用地址进行了副本拷贝,实际指向相同的堆内存,故会互相影响,因此常会讨论深对象的浅拷贝问题。

clipboard.png

现在回归到提问,由图可知,我们无法通过"一次"对象赋值,使得两个对象同时指向 { } 的,只能对堆内存的 Object 进行直接操作,据我所学有2个方法:
1)如上同学回答,使用 delete 操作符删除堆内存对象中属性,删除成空对象;
2)分别对2个对象赋值,都赋值为空对象。

最后说一句,提问用法正如第一位同学所说,这个需求真奇怪。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题