为什么0.-5评估为-5?


84

假设我写的0.50.-5在意想不到的方式,但它仍然可以运行。是什么0.0.-5这样做,它仍然可以运行,并评估为-5?

我也试过alert(0.-5+1)它打印-4,不忽略的JavaScript0.0.-5


55
0.就像0.0。或者只是0
Ry-

61
是什么让您认为这0.-5是“意外的方式”?
Nico Haase

15
@NicoHaase:我很确定OP使用“意外的方式”来表示“我不打算/不希望这样做,但是我确实做到了”。
FilipMilovanović19年

15
这也适用于许多其他语言(例如Python)。我个人根本不喜欢它。我宁愿0.-5遇到语法错误,也不要在结尾加上末尾的浮点文字,而是强迫人们.0在结尾处写。
Giacomo Alzetta

9
这特别糟糕,因为允许数字结尾.可以防止您写类似的东西123.toString(16)(一个常见的技巧是使用123..toString(16),这的确是(123.).toString(16)
12Me21

Answers:


191

a后的尾随数字.是可选的:

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

所以

0.-5

评估为

0 - 5

只是-5。同样,

0.-5+1

0 - 5 + 1

这是

-5 + 1

-4


16
前导数字也是可选的,因此.0-5也是有效的
icenac

48

0.-5可以成功解析为0.[1]-并且5。下面是AST资源管理器生成的表达式的抽象语法树:

解析AST资源管理器生成的树

这(以一种意外的方式)是有效的JavaScript,其值为-5


[1]根据数字文字的语法,十进制数字和指数部分是可选的:

NumericLiteral ::
  DecimalLiteral
  [...]

DecimalLiteral ::
  DecimalIntegerLiteral。DecimalDigits opt ExponentPart opt


您是如何提取AST的?
Κωλζαρ

8
转到astexplorer.net,选择一种语言和解析器,粘贴代码,选择JSON输出(或仅截取屏幕截图)。
Salman A

39

在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..toString()
Tvde1

2
如果确实如此,则必须执行5..toString()来调用该方法,否则,必须使用括号:(5).toString()
jo_va

3
@PeterMortensen Ruby,一个。同样是ALGOL68。在Common Lisp中,奇怪的1.0是,浮点数1.是整数。
Sneftel

2
@FlorianF您不会,但这并不意味着解析器应采用特殊情况以拒绝它。float有方法,5.float
chepner

2
@MasonWheeler当然,并非其他任何(1).toMethod()合法的语言都禁止(1.)正确解析。最传统的解析方法(对包括文字的标记进行贪婪词汇化,然后进行解析)会产生Javascript行为。
Sneftel

7

我认为真正的答案不是小数点,而是减号:如果在它前面加一个看起来像数字的东西,难道不是要解释为运算符吗?


1
然后,至少从某些角度来看,它仍然将小数点解释为数字文字的一部分,否则,减号之前的内容将不会“看起来像数字”。
Pac0

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

“ 0”。或'0'在JavaScript中相同,因为类型对于数字是唯一的,称为Number。减号运算符位于数字之间,请始终尝试将传递的内容转换为数字。在Python中有所不同,第一个是Float,第二个是Integer,因为它有几种类型。


这个问题与类型无关。它仅与语法有关。
user4642212
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.