var a = {"a":1111};
var b = {"b":2222};
var c = a;
这时改 c对象中的值,a对象也会变,如:c.a=3333; 这时a对象会变为{"a":3333}
那我要怎么把c对象变成{},同时a对象也能变为{}
var a = {"a":1111};
var b = {"b":2222};
var c = a;
这时改 c对象中的值,a对象也会变,如:c.a=3333; 这时a对象会变为{"a":3333}
那我要怎么把c对象变成{},同时a对象也能变为{}
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) // {}
}
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,存储于堆内存中,引用类型赋值时,对引用地址进行了副本拷贝,实际指向相同的堆内存,故会互相影响,因此常会讨论深对象的浅拷贝问题。
现在回归到提问,由图可知,我们无法通过"一次"对象赋值,使得两个对象同时指向 { } 的,只能对堆内存的 Object 进行直接操作,据我所学有2个方法:
1)如上同学回答,使用 delete 操作符删除堆内存对象中属性,删除成空对象;
2)分别对2个对象赋值,都赋值为空对象。
最后说一句,提问用法正如第一位同学所说,这个需求真奇怪。
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
非得搞这么蛋疼的需求的话,可以这么搞