<div dir="ltr"><div><div>It looks like Babel is taking some invalid shortcuts here. The DestructuringAssignmentEvaluation runtime semantics[1] require the same source object (the parameter `value`) to be used throughout the destructuring operation. Babel compiles the first destructuring into<br><br>var bar = foo.bar;<br>var qaz = foo.qaz;<br><br></div>So `foo` gets looked up twice, with the second lookup resulting in a different value, the one that the `bar` getter assigned to `foo`. In SpiderMonkey, both getters get called (you can check this with console.log calls in the getters) because the destructuring operates on the same value throughout.<br><br></div>Curiously, the inline destructuring in the console.log call at the end fares better here: it assigns `foo` to a temporary variable `_foo`, so changing the value of `foo` doesn't influence results. (I do wonder if that causes `foo` to be leaked forever, though: `_foo` is a global variable defined at the script's top.)<br><div><div><br>[1] <a href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-runtime-semantics-destructuringassignmentevaluation">http://www.ecma-international.org/ecma-262/6.0/index.html#sec-runtime-semantics-destructuringassignmentevaluation</a><br><div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 20, 2015 at 10:58 AM, Michał Wadas <span dir="ltr"><<a href="mailto:michalwadas@gmail.com" target="_blank">michalwadas@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Following code:<br>
<br>
<br>
var foo = {<br>
  get bar() {<br>
    foo = {<br>
      qaz: 'bar-r'<br>
    };<br>
    return 'bar-c';<br>
  },<br>
  get qaz() {<br>
    foo = {<br>
      bar: 'qaz-r'<br>
    }<br>
    return 'qaz-c';<br>
  }<br>
};<br>
<br>
let {bar, qaz} = foo;<br>
console.log(({bar, qaz} = foo));<br>
<br>
Firefox:<br>
Object { bar: "qaz-r" }<br>
Babel:<br>
Object { qaz: "bar-r" }<br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div><br></div></div></div></div></div>