我总是有这样一种直觉,代码中的表达式可以在心理上被它的计算结果替换.但是,以下两个代码片段具有不同的执行结果.

let obj = {};
({a: obj.b, b: obj.a} = {a: 1, b: 2}); //* This line
console.log(obj); // {b: 1, a: 2}

let obj = {a: 1, b: 2};
({a: obj.b, b: obj.a} = obj); //* and this line
console.log(obj); // {a: 1, b: 1}

我认为这两条带星号的线在我的大脑中是一样的,但它们有不同的执行结果.

这是故意设计的吗?

推荐答案

对象析构只是这方面的句法糖分:

let obj = {};

// ({a: obj.b, b: obj.a} = {a: 1, b: 2});
const __temp_source = {a: 1, b: 2};
obj.b = __temp_source.a;
obj.a = __temp_source.b;

console.log(obj); // {b: 1, a: 2}

但在这里,源和目标是同一个对象

let obj = {a: 1, b: 2};

// ({a: obj.b, b: obj.a} = obj);
obj.b = obj.a;
obj.a = obj.b;

console.log(obj); // {a: 1, b: 1}

你能做的就是

let obj = {a: 1, b: 2};

[obj.a, obj.b] = [obj.b, obj.a];

// const __temp_source = [obj.a, obj.b];
// obj.b = __temp_source[0];
// obj.a = __temp_source[1];

console.log(obj); // {a: 2, b: 1}

Javascript相关问答推荐

如果被1个Phaser JS抵消,我的倾斜碰撞

nPM审计始终发现0个漏洞

如何使用JavaScript动态地将CSS应用于ToDo列表?

如何使用Paged.js仅渲染特定页面

在JavaScript中检索一些文本

JS、C++和C#给出不同的Base 64 Guid编码结果

如何在coCos2d-x中更正此错误

Reaction Native中的范围滑块

WhatsApp Cloud API上载问题:由于MIME类型不正确而导致接收&Quot;INVALID_REQUEST";错误

如何在使用rhandsontable生成表时扩展数字输入验证?

在数组中查找重叠对象并仅返回那些重叠对象

为什么这个.add.group({})在教程中运行得很好,但在我的游戏中就不行了?

使用带有HostBinding的Angular 信号来更新样式?

为什么我的按钮没有从&q;1更改为&q;X&q;?

使用Document.Evaluate() Select 一个包含撇号的HTML元素

将范围 Select 器添加到HighChart面积图

处理TypeScrip Vue组件未初始化的react 对象

ComponentWillReceiveProps仍在React 18.2.0中工作

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

在将元素追加到DOM之前,createElement()是否会触发回流?混淆abt DocumentFragment行为