Javascript 正在设置对象属性:!object.property易失性?
该代码是否会使对象发生变异,或者以任何其他方式不稳定? 如果是这样,我怎么能避免呢Javascript 正在设置对象属性:!object.property易失性?,javascript,javascript-objects,Javascript,Javascript Objects,该代码是否会使对象发生变异,或者以任何其他方式不稳定? 如果是这样,我怎么能避免呢 const object = {property: false}; const test = {property: !object.property}; 你的代码不会改变任何东西。当您创建测试时,原始对象不会受到影响,因为。属性是布尔值(因此是值类型),因此新的赋值仅按值进行 const test = {property: !object.property}; // assigns a new value to
const object = {property: false};
const test = {property: !object.property};
你的代码不会改变任何东西。当您创建
测试
时,原始对象
不会受到影响,因为。属性
是布尔值(因此是值类型),因此新的赋值仅按值进行
const test = {property: !object.property}; // assigns a new value to a new reference
另一方面,这有:
const object = {property: false};
object.property = !object.property; // mutating the object
const test = object; // copying the reference
不过,您可以这样做:
const object = {property: false};
const test = {...object, property: !object.property}; // creates a copy of object and over-writes the value of the new property
不,您的代码不会改变任何对象。请在控制台中尝试,您将看到哪些更改,哪些没有更改。尝试使用不同的值和运算符,您将很快了解其工作原理。如果仍然不清楚,您可以查看一些基本的JavaScript教程或阅读ECMAScript规范。JavaScript是单线程的,因此波动性不是真正的问题,除非您在异步操作后引用自由变量<代码>变量x={foo:'bar'};异步函数main(){console.log(x);等待新承诺(resolve=>setTimeout(resolve,100));console.log(x);}main();setTimeout(=>x.foo='test',0)代码>是您唯一需要担心的情况。