【问题标题】:ECMAScript 2015, iterable destructuring expressionECMAScript 2015,可迭代解构表达式
【发布时间】:2015-12-13 10:54:10
【问题描述】:

我现在正在试验可迭代的解构表达式,我想知道为什么特定的方式不起作用。也许你可以帮我解决这个问题。

例如有效的:

var x, y, myIterable = [];
myIterable[Symbol.iterator] = function* () {
  var count = 0;
  while(count < 2){
    yield count++;
  }
};
var myArray = Array.from(myIterable);
console.log(([x,y] = myArray) === myArray);
//OUTPUT: true

但是如果我这样尝试它会返回false,你能解释一下原因吗?

var x, y, myIterable = [];
myIterable[Symbol.iterator] = function* () {
  var count = 0;
  while(count < 2){
    yield count++;
  }
};
var myArray = Array.from(myIterable);
[x, y] = myArray;
console.log([x,y] === myArray);
//OUTPUT: false

【问题讨论】:

    标签: javascript ecmascript-6 destructuring


    【解决方案1】:

    尽管=== 执行引用相等性检查,但根据本杰明的回答,您的第一个测试返回true 的原因是因为分配的结果:

    [x, y] = myArray 
    

    不是[x, y],而是myArray - 赋值运算符计算为 RHS,而不是新分配的 LHS。

    所以给定:

    ([x,y] = myArray) === myArray
    

    === 的 LHS 计算结果为 myArray,这与您在 RHS 上的对象完全相同,因此结果为 true

    【讨论】:

      【解决方案2】:

      === 按引用比较对象,因为 myArray[x, y] 计算为不同的数组。

      [] === []; // false
      {} === {}; // false
      

      【讨论】:

      • 奇怪的问题 - 知道如何使用 Symbol.iteratoryield,但不是 === 比较参考质量。
      猜你喜欢
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多