Порядок операций JavaScript - скобки не вычисляются перед оператором постинкремента - PullRequest
0 голосов
/ 29 апреля 2018

Пример 1:

var a = 0;
var b = 1;
a = (b++);
console.log(a);

a равно 1, то же самое, с круглыми скобками или без них. Пример 2:

var a = 0;
var b = 1;
a = b++;
console.log(a);

Я понимаю второй пример. b присваивается a, затем увеличивается до 2. Но в первом примере, почему скобки не заставляют b увеличиваться до 2, прежде чем присваивать значение a, данные скобки имеют наивысший приоритет оператора? Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Объяснение Т.Дж. это хорошо на теоретическом уровне того, что происходит, но вот другое объяснение с другой стороны (более практическое, чем теоретическое):

У нас есть два похожих выражения b++ и ++b. Оба означают b = b + 1, но работают по-разному.

b++ оценивает текущее значение b (которое равно 1), затем увеличивает его. Это эквивалентно:

var a = 0;
var b = 1;
a = b;
b = b + 1; //(b + 1) makes no difference
console.log(a);

++b делает обратное, увеличивает b, а затем оценивает его в увеличенное значение. Это эквивалентно:

var a = 0;
var b = 1;
b = b + 1; //(b + 1) makes no difference
a = b;
console.log(a);

Теперь обратите внимание, что добавление круглых скобок b + 1 в любом из приведенных выше примеров не будет иметь значения, поскольку присваивание a = b выполняется на другом шаге. Точно так же добавление скобок к b++ не будет иметь никакого значения, поскольку присвоение a и инкриминирование выполняются в два разных этапа.

Однако круглые скобки вокруг b++ фактически эквивалентны круглым скобкам вокруг b в строке a = b в приведенном выше коде, а не вокруг b + 1, как вы, кажется, думаете из своего вопроса. И ясно, что круглые скобки a = (b) не имеют никакого значения.

РЕДАКТИРОВАТЬ Как вы предложили в своем комментарии, если мы думаем о b++ как о неявной функции, то тело функции похоже на объяснение Т.Дж.:

  1. Сохранить значение b (1), скажем, в неявной переменной x
  2. Увеличение b до 2
  3. и возврат x

Размещение скобок вокруг вызова функции похоже на помещение их вокруг возвращаемого значения, равного 1. Вот демонстрация:

var a = 0;
var b = 1;
a = bPlusPlus(); //(bPlusPlus()) makes no difference
console.log(a);

function bPlusPlus() {
  var x = b;
  b = b + 1;
  return x;
}
0 голосов
/ 29 апреля 2018

Я понимаю второй пример. b присваивается a, затем увеличивается до 2.

Не совсем. Оставляя некоторые детали, это:

  1. Считайте значение b (1) и отложите его в сторону.
  2. Увеличение b до 2.
  3. Сделать в результате выражения b++ значение, которое было отложено на шаге 1 (значение 1).
  4. Назначьте результат с шага № 3 на a.

... вот почему () не имеет никакого значения. :-) Результат выражения b++ просто распространяется как результат оператора группировки (()).

Подробности в спецификации .

...