RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 759151
Accepted
Виталик Черный
Виталик Черный
Asked:2020-12-16 20:46:52 +0000 UTC2020-12-16 20:46:52 +0000 UTC 2020-12-16 20:46:52 +0000 UTC

解构赋值是如何工作的?

  • 772

解释解构赋值算法是如何工作的。我决定测试这种行为,但我不知道为什么控制台会给出这些结果。

在提出问题之前,我熟悉了所有来源,除了规范本身,因为它很难理解,而且我不懂英语。

资料来源:ES6:重组赋值、解构、解构赋值。

一

var {a,aa,...aaa} = [2, 4, 23];

console.log(a, aa, aaa);

2

var [a,aa,...aaa] = {a:2, aa: 4, aaa: 23};

console.log(a, aa, aaa);

UPD:我使用了 Babel.js,也许它会有所帮助。

javascript
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Qwertiy
    2020-12-17T06:43:09Z2020-12-17T06:43:09Z

    var{a,aa,...aaa} = [2, 4, 23];

    var src = [2, 4, 23];
    var a, aa, aaa;
    
    a = src.a;
    
    aa = src.aa;
    
    aaa = {};
    for (var key in src)
      if (key !== 'a' && key !== 'aa' && src.hasOwnProperty(key))
        aaa[key] = src[key];
    
    console.log(a, aa, aaa);

    可以通过以下方式验证此行为:

    var {a, b, ...rest} = {
      __proto__: {
        b: 2, // декомпозиция в переменную
        d: 4  // исчезает, т. е. НЕ попадает в rest
      },
      a: 1, // декомпозиция в переменную
      c: 3  // попадает в rest
    }
    
    console.log(a, b, rest)

    如果你想把一个数组作为一个对象,那么你可以使用重命名的分解——毕竟,数字不能是变量名,但我提请你注意它aaa仍然是一个对象,而不是一个数组:

    var { 0:a, 1:aa, ...aaa } = [2, 4, 23];
    console.log(a, aa, aaa);

    var[a,aa,...aaa] = {a:2, aa: 4, aaa: 23};

    var src = {a:2, aa: 4, aaa: 23};
    var a, aa, aaa;
    
    var i = 0;
    aaa = [];
    for (var x of src) { // Упадёт прямо на of
      switch (i++) {
        case 0:
          a = x;
          break;
        case 1:
          aa = x;
          break;
        default:
          aaa.push(x);
      }
    }
    
    console.log(a, aa, aaa);

    只有可迭代[]对象才能通过以下方式解构:

    var src = { *[Symbol.iterator]() { yield 2; yield 4; yield 23; } };
    var a, aa, aaa;
    
    var i = 0;
    aaa = [];
    for (var x of src) {
      switch (i++) {
        case 0:
          a = x;
          break;
        case 1:
          aa = x;
          break;
        default:
          aaa.push(x);
      }
    }
    
    console.log(a, aa, aaa);

    PS:一般情况下,最好是人为地做每一件事:

    var [a, aa, ...aaa] = [2, 4, 23];
    console.log(a, aa, aaa);

    var {a, aa, ...aaa} = {a:2, aa: 4, aaa: 23};
    console.log(a, aa, aaa);

    • 7
  2. Дмитрий Полянин
    2020-12-17T02:58:34Z2020-12-17T02:58:34Z

    在这两种情况下,行为都是不可理解的,因为您试图将对象推入数组,反之亦然。

    有关语法,请参阅文档:

    var a, b, rest;
    [a, b] = [1, 2];
    console.log(a); // 1
    console.log(b); // 2
    
    [a, b, ...rest] = [1, 2, 3, 4, 5];
    console.log(a); // 1
    console.log(b); // 2
    console.log(rest); // [3, 4, 5]
    
    ({a, b} = {a:1, b:2});
    console.log(a); // 1
    console.log(b); // 2
    
    ({a, b, ...rest} = {a:1, b:2, c:3, d:4}); 
    

    没有将数组解构为对象的选项,反之亦然。所有例子中左右括号都一样,也就是说,数组被解构为数组,而对象被解构为对象。

    这是一个按预期工作的结构,请注意括号:

    var [a,aa,...aaa] = [2, 4, 23, 144];
    console.log(a, aa, aaa);

    Point 1.运行 babel 并获取代码:

    var _ref = [2, 4, 23],
    a = _ref.a,
    aa = _ref.aa,
    aaa = _objectWithoutProperties(_ref, ["a", "aa"]);
    

    我们a放入ref.a是因为_ref是一个数组,ref.a所以没有设置。与aa. 现在我们看一下,我们把除了andaaa之外的所有值都放到了\u200b\u200bin 中,但是由于and没有设置,所以我们在输出时得到了所有三个值。aaaaaa

    总而言之,aand中aa没有放入任何内容,因为数组中没有名称为aand的变量aa,aaa我们将剩下的所有内容放入其中。

    • 3
  3. LiaVa
    2020-12-17T06:36:36Z2020-12-17T06:36:36Z

    我什至读过一篇关于 MDN 的文章,理解了本质。
    对于数组:不管数组是如何获得的(MDN 例子中的变量和函数会让很多人感到困惑),关键是赋值发生的顺序与第一个数组中的变量相同:

    var [a, b, c]=[vl1,vl2,vl3]
    a->vl1
    b->vl2
    c->vl3
    

    如果右侧数组中的值比左侧数组中的值多,则根本不使用多余的值,或者将其放在带有扩展运算符的变量中(...)

    var [a, b, c, ...d]=[vl1,vl2,vl3,vl4,vl5]
    a->vl1
    b->vl2
    c->vl3
    d->[vl4,vl5]
    

    对于对象:

    几乎相同,只有值通过属性键放置在变量中:

    var {a,c,b}={a:1,b:2,c:3}
    a->1
    b->2
    c->3
    

    var {a,c,b,...w}={a:1,b:2,c:3,d:10,e:12}
    a->1
    b->2
    c->3
    w->{d:10,e:12}
    

    在这两种情况下,左侧数组中的额外变量都将声明为 undefined

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5