JavaScript увеличивает унарный оператор ( ) для строк

#javascript #specifications

#javascript #технические характеристики

Вопрос:

Я использую версию Chromium 53.0.2785.143, созданную на Ubuntu, работающую на Ubuntu 16.04 (64-разрядная версия)

В соответствии со спецификацией языка ECMAScript® оператор приращения префикса вычисляется следующим образом:

Этапы вычисления оператора префиксного инкремента

Имея это в виду, я не могу объяснить этот результат:

   '1';
> Uncaught ReferenceError: Invalid left-hand side expression in prefix operation
  

когда следующий код работает как шарм:

 var x = '1'; 
  x;
> 2
  

Насколько я понимаю, в обоих случаях первые 3 маркера второго шага являются истинными, тогда как для '1' случая четвертый маркер также является истинным (но почему?), А для x случая он равен false, не вызывая ошибок. Я прав?

PS: Firefox выдает a SyntaxError: invalid increment operand вместо a ReferenceError

Комментарии:

1. Кстати, вы получите ту же ошибку, если выполните 1

2. PutValue('1', 2) выдает ошибку, поскольку она не может быть присвоена строковому литералу. Вам нужна переменная или какой-либо другой вид Reference .

Ответ №1:

Проблема в том, что ваш оператор неявно включает присваивание, и вы не можете присвоить новое значение строковой константе. Обратите внимание, что

   2;
  

также ошибочно по той же причине.

Комментарии:

1. … что предположительно происходит в 5. Call PutValue(expr, newValue) ?

2. О .. я это пропустил. Спасибо за ответ!

Ответ №2:

В моем понимании, похоже на = 1 .

Таким образом, он будет работать x , поскольку он будет вычислен в x =1 or x=x 1 , но '1' является строковым литералом и не имеет значения для присвоения левой стороны, следовательно, он завершается неудачей

Комментарии:

1. Вы даже можете буквально сделать '1' = Number('1') 1 и получите ту же ошибку

2. Потому что значение левой стороны недопустимо. вы не можете иметь '1' в качестве имени переменной

3. О .. я это пропустил. Спасибо за ответ!