javascript - 为什么解构的工作方式不同于 Javascript (ES6) 中的经典赋值?

标签 javascript ecmascript-6 destructuring

正如您在这里看到的,我们将“fibonacci”设置为“可迭代”对象,并使用 for .. of: 对其进行循环:

let fibonacci = {
              [Symbol.iterator]() { 
                let pre = 0, cur = 1;
                return {
                  next() {
                    [pre, cur] = [cur, pre + cur];
                    return { done: false, value: cur }
                  }
                }
              }
            }

            for (var n of fibonacci) {
              // truncate the sequence at 1000
              if (n > 1000)
                break;
              console.log(n);
            }

正如 for of 循环中预期的那样,控制台日志写入 1,2,3,5,8,..

但是

如果我写 pre = cur; cur = pre + cur; 而不是 [pre, cur] = [cur, pre + cur];

console.log 将写入 2,4,8,16,..

为什么?解构不只是一种在一行中设置多个值的方法吗?我们如何解释分配的差异?

最佳答案

pre = cur; cur = pre + cur; 

通过对 pre 的赋值,您丢失了 pre 的旧值,并且下一个赋值是错误的。

pre  cur  comment           values
---  ---  ----------------  -------
  0    1  start values         *
  1    1  pre = cur
  1    2  cur = pre + cur      *
  2    2  pre = cur
  2    4  cur = pre + cur      *
[pre, cur] = [cur, pre + cur];

destructuring assignment保留值直到分配整个数组。

关于javascript - 为什么解构的工作方式不同于 Javascript (ES6) 中的经典赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49316973/

相关文章:

javascript - ECMAScript-6音频永远重复

javascript - 解构和重命名属性

javascript - 对象解构在 Promise 中解析和拒绝

javascript - 数组解构赋值在 Node.js 中使用 Harmony 选项在 v8 中不起作用

javascript - HTML5 canvas - 字母居中?

JavaScript 全屏 API 插件

javascript - 将纪元时间转换为分钟-Javascript

javascript - 如何将对象解构为参数名称

javascript - jQuery 点击事件停止传播无法开始工作?

javascript - 如何判断一条消息是否为回复,并查看回复的消息内容? (discord.js)