Подтвердить что ты не робот

{} - 0 VS ({} - 0) в JavaScript

В консоли Chrome JavaScript, почему в скобках оператор {} - 0 в скобках меняет возвращаемое значение?

{} - 0    // Returns -0
({} - 0)  // Returns NaN

Кажется невероятно странным, что перенос одного оператора в круглые скобки изменяет содержащееся значение. Что мне здесь не хватает?

4b9b3361

Ответ 1

Существуют две возможные интерпретации строки {} - 0:

  • Его можно интерпретировать как {}; -0, где {} интерпретируется как пустой оператор блока, а - - это оператор унарного отрицания (поэтому -0 - это просто "отрицательный ноль" ). Значение этого при оценке - это значение последнего оператора, который равен -0.
  • Его можно интерпретировать как ({} - 0), где {} интерпретируется как пустой объект, а - - оператор вычитания (поэтому 0 вычитается из {}).

В вашей первой строке это неоднозначно, поэтому он выберет первую интерпретацию. Во второй строке первая интерпретация недействительна (поскольку блок-оператор никогда не может быть частью выражения, которое вы заставляете с помощью скобок).

Ответ 2

{} - 0: здесь {} - это просто пустой блок, который ничего не делает, поэтому -0 возвращается консолью.

({} - 0): здесь {} является частью выражения и преобразуется в число. В этом пустом объекте нет метода valueOf(), и при преобразовании в число он возвращается к методу toString(), который возвращает что-то вроде object Object для {}. Затем эта строка object Object преобразуется в число и дает NaN, поскольку на самом деле это не число. Итак, у нас есть

({} - 1)('object Object' - 1)(NaN - 1)

и все с NaN дает NaN. Это то, что вы наконец видите в консоли.

Ответ 3

{} - 0

интерпретируется: {} empty block statement и - 0 negative zero

({} - 0)

все внутри () интерпретируется как выражение, empty object - 0 = NaN