【发布时间】:2016-09-01 15:33:36
【问题描述】:
我正在研究一个事件小部件并发现奇怪的行为,这可能是菜鸟问题。
下面是我正在处理的代码块
var event={0:{competition:{like:false}}}
console.log(event[0].competition.like); //returns false
var cmpt=event[0].competition;
cmpt.like=true;
console.log(event[0].competition.like) //returns true
您能帮我理解一下,为什么事件对象内的竞争的 属性 [like] 的值会更新。 以及如何防止这种情况而不是更新事件对象?
我尝试调查 google/so,但这些问题解决了不同的问题。
【问题讨论】:
-
你只是在复制一个引用,而不是对象。
-
这是因为在 javascript 中对象是通过引用传递的,为了使其按照您希望的方式工作,您需要克隆竞争对象。
-
如果它不是字符串或数字,那么它是一个引用(指针)。要复制一个对象(而不是指向它),请执行
Object.create(event[0].competition) -
@jcubic:虽然
Object.create()的实现细节严格继承自给定对象,但语义完全等同于深度克隆。更改父对象不会更改子对象,更改子对象不会更改父对象。这就是为什么Object.create()被认为是现代 js 环境中的标准深拷贝技术。 -
@slebetman 看看这个jsfiddle.net/yfyv74nm/1
标签: javascript variable-assignment assignment-operator