2017-01-22 1 views
1

に結果を追加:明白な増加と構文JavaScriptで遊んで、それは次のコードは、SpiderMonkeyのとV8エンジンでエラーがスローされますことを私を襲ったとき、エラー

var a = 1, b = 1; 
a++++b; 

この私には、次の作品以来、奇妙です完全に罰金:

var a = 1, b = 1; 
a++ ++b; // throws an error 
:また

var a = 1, b = 1; 

a+++b; // = 2; (Add a and b, then increase a) 
// now a == 2 and b == 1 

a+++-b; // = 1; (add a and -b, then increase a) 
// now a == 3 and b == 1 

、次のように無意味なコードになります210

私の引数はa+++ba+ ++ba++ + bに相当し、ではない、とa+++-ba++ + -bと同等であれば、その後、a++++bが唯一、有効なJavaScriptコードであるためにはa++ + +bとして解釈することができるということになりました。 代わりに、a++++ba++ ++bと解釈され、operator precedenceであると主張しています。

これは、除算と正規表現を区別するために、/シンボルas explained hereを使用してエンジンが実装するロジックとは対照的です。例えば、ここで

var e = 30, f = 3, g = 2; 

e/f/g; // == 5 

e 
/f/g; // == 5 

/f/g; // is equivalent to new RegExp("f","g") 

引数は/f/gは、最後の行の部門として意味がないので、それは正規表現として解釈されていることです。

明らかに、/シンボルは、除算と正規表現を区別するために特別な処理を行います。しかし、なぜ++--も特別な扱いを受けませんか?

2番目の質問は、コードに複数の有効な解釈がある場合、のみと呼ばれていない理由です。

答えて

2

コードa++++bには、a++++bの2つの異なるステートメントがあります。 a++ + +bという文脈の+演算子は、実際には文字列を数値に変換するための型変換器であり、リスト内の他の部分に続く異なるorder of precedenceを持っています。

+1

はい、 '+'は "キャスト"のためにも使われます - 例えば '+" 10 ''はその 'string'型を' number'型に変換します – iSkore

+0

@CoryGあなたの答えを詳しく解説してください。私はこれが私の質問ですでに議論したこととはどう違うのか見当たりません。 – TrenchCode

+0

@TrenchCodeごめんなさい申し訳ありませんが、過去数ヶ月間JSと非常によく似たカスタム言語用のパーサ、トークナイザ、および抽象構文ツリーシステムを作成していますので、PitAそれは当初、優先順位の周りに私の頭を包むことでした。 JSは非常に迅速に解析されるように設計されています。その結果、他の多くの言語のように明確な優先順位を持たないため、そのリストは仕様を踏まずに得られるほど良好です。 '@'コメントや '+'型コンバータのようなものは、そのリスト全体の前と後に解析されます(cont) – CoryG

関連する問題