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

oco*_*mfd 72 javascript numbers

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

我也试过alert(0.-5+1)打印-4,JavaScript忽略0.0.-5吗?

Cer*_*nce 173

a后面的跟踪数字.是可选的:

console.log(0. === 0); // true
Run Code Online (Sandbox Code Playgroud)

所以

0.-5
Run Code Online (Sandbox Code Playgroud)

评价

0 - 5
Run Code Online (Sandbox Code Playgroud)

这只是-5.同样的,

0.-5+1
Run Code Online (Sandbox Code Playgroud)

0 - 5 + 1
Run Code Online (Sandbox Code Playgroud)

是的

-5 + 1
Run Code Online (Sandbox Code Playgroud)

-4.

  • 前导数字也是可选的,因此.0-5也有效 (11认同)

Sal*_*n A 45

0.-5可以成功解析为0.[1],-5.下面是AST explorer生成的表达式的抽象语法树:

AST探险家生成的解析树

这(以意想不到的方式)是有效的JavaScript并且评估为-5.


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

NumericLiteral ::
  DecimalLiteral
  [...]

DecimalLiteral ::
  DecimalIntegerLiteral.DecimalDigits opt ExponentPart opt

  • 转到https://astexplorer.net/,选择语言和解析器,粘贴代码,选择JSON输出(或只是截取屏幕截图). (7认同)

Cha*_*lie 38

在JS中,您可以使用可选的小数点表示数字.

x = 5.;    //5
x = 5. + 6.   //11
Run Code Online (Sandbox Code Playgroud)

从Tvde1的评论来看,任何Number方法也可以应用.

5..toString()
Run Code Online (Sandbox Code Playgroud)

这个语法让我们运行没有括号的数字函数.

5.toString() //error
(5).toString() //good
5..toString() //good
5 .toString() // awesome
Run Code Online (Sandbox Code Playgroud)

看到这个问题,找出原因.

  • 你甚至可以做`5..toString()`. (4认同)
  • @PeterMortensen Ruby,一个.还有ALGOL 68.在Common Lisp中,奇怪的是,`1.0`是浮点数,但是`1.`是一个整数. (3认同)
  • 事实上,你必须做5..toString()来调用方法,否则你必须使用括号:(5).toString() (2认同)
  • @FlorianF你不会,但这并不意味着解析器应该是特殊的,以拒绝它.`float`s有方法,```是`float`. (2认同)
  • 您可以将 `5 .toString() // awesome` 添加到列表中 :) (2认同)
  • @MasonWheeler肯定*不是*的情况,`(1).toMethod()`合法的任何其他语言都禁止`(1.)`正确解析.最传统的解析方法(令人贪婪的令牌,包括文字,然后解析)会产生Javascript行为. (2认同)

小智 8

我认为真正的答案不是关于小数点,而是关于减号:如果它前面有任何看起来像数字的东西,那么它不会被解释为运算符吗?


小智 6

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
Run Code Online (Sandbox Code Playgroud)

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