Почему 0. -5 оценивается как -5?

Предположим, я записал 0.5 как 0.-5 неожиданным образом, но он все еще может работать. Что делает 0. в 0.-5, чтобы он все еще мог работать и вычислять до -5?

Я также пробовал alert(0.-5+1) которое печатает -4, игнорирует ли JavaScript 0. в 0.-5?

Ответ 1

Конечные цифры после a . являются необязательными:

console.log(0. === 0); // true

Ответ 2

0.-5 может быть успешно проанализирован как 0. [1]- и 5. Ниже приведено абстрактное синтаксическое дерево для выражения, сгенерированного AST explorer:

Parse tree generated by AST explorer

Это (неожиданным образом) допустимый JavaScript и оценивается как -5.


[1] Согласно грамматике для числовых литералов десятичные цифры и экспоненты являются необязательными:

NumericLiteral ::
ДесятичнымЛитералом
[...]

ДесятичнаяЛитеральная ::
DecimalIntegerLiteral. ДесятичныеЦифры опц ЭкспоненциальнаяЧасть опц

Ответ 3

В JS вы можете выразить число с необязательной десятичной точкой.

x = 5.;    //5
x = 5. + 6.   //11

А что касается комментария Tvde1, то может быть применен любой метод Number.

5..toString()

Этот синтаксис позволяет нам запускать функции Number без скобок.

5.toString() //error
(5).toString() //good
5..toString() //good
5 .toString() // awesome

Посмотрите этот вопрос, чтобы узнать почему.

Ответ 4

Я думаю, что реальный ответ не о десятичной запятой, а о знаке минус: не будет ли это интерпретироваться как оператор, если ему предшествует что-либо, похожее на число?

Ответ 5

console.log(0. - 5)      // -5
console.log(0 - 5)       // -5
console.log('0.' - 5)    // -5
console.log('0' - 5)     // -5
console.log(0.-5 === -5) // true