0.-5が-5と評価されるのはなぜですか?


84

予期しない方法で記述0.50.-5たが、それでも実行できるとします。何を0.して0.-5、それはまだ実行することができそうと評価さ-5?

alert(0.-5+1)-4を出力するものも試しましたが、JavaScriptは無視0.0.-5ますか?


55
0.のような0.0です。または単に0
Ry-

61
それ0.-5が「思いがけない方法」だと思う理由は何ですか?
ニコハーゼ

15
@NicoHaase:OPが「予期しない方法」を使用して、「それを書くつもりはなかった/書くつもりはなかったが、どういうわけか書いた」という意味だったと確信しています。
フィリップMilovanović

15
これは他の多くの言語(Pythonなど)でも機能します。個人的には全然好きではありません。私はむしろ0.-5構文エラーがあり、末尾にピリオドが付いたfloatリテラルを許可せず.0、最後に書き込むように強制したいと思います。
ジャコモアルゼッタ

9
数字で終わることを許可.すると、次のようなものを書くことができなくなるため、特に悪いです123.toString(16)(一般的なトリックは、を使用することです123..toString(16)。これは実際に(123.).toString(16)
12Me 2119

回答:


191

aの後の末尾の数字.はオプションです。

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

そう

0.-5

に評価する

0 - 5

これはただ-5です。同様に、

0.-5+1

です

0 - 5 + 1

これは

-5 + 1

または-4


16
大手の数字は、また、その0.0から5にも有効である任意です
icenac

48

0.-50.[1]-およびとして正常に解析できます5。以下は、ASTエクスプローラーによって生成された式の抽象構文ツリーです。

ASTエクスプローラーによって生成された解析ツリー

これは(予期しない方法で)有効なJavaScriptであり、に評価され-5ます。


[1]数値リテラルの文法によると 10進数と指数部分はオプションです。

NumericLiteral ::
  DecimalLiteral
  [...]

DecimalLiteral ::
  DecimalIntegerLiteral。DecimalDigits opt ExponentPart opt


どのようにしてASTを抽出しましたか?
Κωλζαρ

8
行くastexplorer.net、言語とパーサを選択し、コードを貼り付け、JSONの出力を選択する(あるいは単にスクリーンショットを取ります)。
サルマン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_va19年

3
@PeterMortensen Ruby、その1つ。また、ALGOL68。CommonLispでは、奇妙なことに、1.0浮動小数点ですが1.整数です。
Sneftel

2
@FlorianFあなたはそうしませんが、それはパーサーがそれを拒否するために特別な場合でなければならないという意味ではありません。floatsにはメソッドがあり、5.floatです。
chepner

2
@MasonWheeler合法である他の言語が適切に解析することを禁止しているわけではありませ。構文解析の最も伝統的なアプローチ(リテラルを含むトークンの貪欲な字句解析、次に構文解析)は、Javascriptの動作を生成します。(1).toMethod()(1.)
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でも同じです。これは、型が数値と呼ばれる数値に対して一意であるためです。マイナス演算子は数値の間にあります。渡したものを常に数値に変換するようにしてください。Pythonでは、いくつかのタイプがあるため、最初はFloatで、2番目はIntegerです。


この問題はタイプとは関係ありません。構文にのみ関連しています。
user4642212
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.