Почему x выдает сообщение об ошибке, когда x работает нормально?

#javascript

#javascript

Вопрос:

 var x = null;
  

x генерирует ReferenceError , но когда я делаю то же самое, используя оператор постфиксного инкремента x , он работает просто отлично.

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

1. почему вы хотите увеличить значение null??? в любом случае

2. Не работает в моем браузере Chrome(14.0.835).

3. В Chrome оба выдают ReferenceError

4. Почему вы хотите увеличить значение NULL ??? это мой вопрос!!!

5. я знаю, что ( X) сделает это, но почему не x = 0 ; ??? это чище и проще

Ответ №1:

Оператор LeftHandSideExpression for не должен быть числом. Например

 1  ;
  

завершится ошибкой с той же ошибкой (недопустимый операнд приращения). Вы можете применять операторы pre- и postincrement только к переменным / идентификаторам / выражениям.

Поскольку знак преобразует null value в число (0), вы получили тот же результат.

Примеры:

 var foo = null,
    bar = 5;

foo  ;    // 0
0  ;      // invalid increment operand
null  ;   // invalid increment operand
( bar)    // invalid increment operand
foo    2; // 2
  

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

1. Пожалуйста, проверьте обновленный вопрос. Я удалил круглые скобки, и оператор постфиксного инкремента работает во всех браузерах, в то время как префиксный инкремент не работает.

Ответ №2:

x разбивается на два этапа:

  • x инициализирует x равным 0, поэтому оно больше не равно null .
  • затем x увеличивает x, что работает, поскольку x больше не равно null .

x также разбивается на два этапа, но в определенном порядке:

  • x вычисляется первым, что вызывает исключение, поскольку x равно нулю.
  • затем будет вычислен x, за исключением того, что у вас уже было исключение.

Я думаю, вы предполагали, что x будет анализироваться как ( x), но на самом деле он анализируется как ( x) . Это неоднозначный синтаксис, разработчикам языка пришлось выбрать один из двух способов его анализа, и, с вашей точки зрения, они выбрали «другой».

Честно говоря, в любом случае нет абсолютно никакой ценности в форматировании вашего кода таким образом — все, что вы получаете, это сомнительный код, который предназначен для запутывания людей.

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

1. x = 1, когда x равно нулю. он не создает никаких исключений.

2. @Narenda, я думаю, вы предполагаете, что x является целым числом. Целые числа никогда не могут быть нулевыми (код «int x;» автоматически инициализирует x как 0). В этом случае мы имеем дело с пользовательским ссылочным типом (а не встроенным типом значения), который реализует оператор увеличения. Переменным таких типов может быть присвоено значение null, и x в таком случае выдаст исключение.

3. Я просто объявляю var x = null; , а затем делаю x , он возвращается 1 .

Ответ №3:

если вы использовали x= 0; x будет инициализирован целочисленным типом, который будет принимать оператор x, в то время как ( x) похож на ( null), поэтому лучше попробуйте изменить на X = 0 ;