2015-10-07 11 views
7

Trudno mi zrozumieć, co oznacza kombinacja potęgowania i wszystko inne (mnożenie, dzielenie itp.) W grupie 14 pierwszeństwa w JavaScript.Mechanizm ważności operatorów JavaScriptu

Source - MDN

Trzy pytania:

  1. Jaki jest sens łączenia prawej do lewej i od lewej do prawej skojarzeń w jednej grupie?
  2. W jaki sposób wyrażenie 2 ** 3 * 4 może zostać ponownie sformułowane zgodnie z tymi regułami, a mimo to uzyskać tę samą odpowiedź? 4 * 2 ** 3 działa ... czy to znaczy?
  3. Kiedy/jak nie jest to równoważne z pozornie prostszym sposobem nadania potęgowaniu wyższego pierwszeństwa?
+0

od prawej do lewej oznacza 2 ** 3 ** 4 = Math.pow (2, Math.pow (3, 4)); –

Odpowiedz

2

1) 2 ** 3 ** 4, będący stowarzyszeniem od prawej do lewej, to 2 ** (3 ** 4). 2/3/4, będący stowarzyszeniem od lewej do prawej, to (2/3)/4.

2/3) Wierzę, że 2 ** 3 * 4 to (2 ** 3) * 4. 2 * 3 ** 4 jest 2 * (3 ** 4) (według oceny es6fiddle).

Nie wynika to z tabeli; ale potęgowanie powinno mieć pierwszeństwo przed mnożeniem. Mieszanie od lewej do prawej i od prawej do lewej w jednym rankingu pierwszeństwa jest dziwne. W rzeczywistości, o ile mogłem zobaczyć w ES7 drafts, to nie jest w ogóle traktowane gramatycznie tak samo jak *, / i %, ale jako jednoargumentowa operacja (!).

Należy również pamiętać, że w chwili obecnej żadne silniki inne niż Babel i Traceur nie obsługują obecnie **, więc w tej chwili jest to w większości akademickie. MDN to wiki, a operator potęgowania został dodany przez Mozilliana; ale AFAIK, ponieważ Mozilla nie obsługuje obecnie **, nie dokumentuje to w jaki sposób Mozilla interpretuje język.

+0

Dziękujemy! Jakoś nie udawało mi się, że ta potęga jest eksperymentalna ... Wydaje mi się, że zinternalizowałem ją jako istotny powrót w dawnych złych czasach - myślę, że to jest w FORTRANIE :) – NessBird

+0

Potęgowanie jest niezbędne; ale masz 'Math.pow'. '**' to po prostu cukier syntaktyczny. – Amadan