2011-09-17 15 views
0
var zero = 0; 
zero.toString(); // '0' --> fine 
0.toString();  // syntax error! 
0..toString();  // '0' --> fine 

私の結論:x.toString()を呼び出すと、xの値に依存しないだけでなく、途中xを提示しています。構文エラー、または構文エラーはありませんか?

プレゼンテーションのために予期しない構文エラーが発生する可能性のあるJavaScriptの例がありますか?

+1

もう一つの方法は、 '(0).toString()であり、私はちょうどそのISNのようなオブジェクトのための' .'オペレータ、0を知っているから ' – epascarello

+0

@epascarelloが示したように、オブジェクトはまだオブジェクトに変換され、 '.'演算子は利用可能になります。' ..'は同じ効果を持ちますが、より明示的な方法を使用することもできます番号(0) –

答えて

1

まあ、記号が表示される場所の文脈は、彼らがどのように振る舞うかに影響例えば、オブジェクトリテラルVS文のブロックの他の例もあります"ステートメントコンテキスト"では、オブジェクトリテラルはの式コンテキストで評価されます。

また、ファンクション文、例えば対関数宣言:

function foo() {}.length; // SyntaxError, `foo` is a function declaration 
0,function foo() {}.length; // 0, `foo` is a function expression 
(function foo {}).length; // 0 

あなたは投稿の例では、数値リテラルの文法を定義する方法に関し、ドットの後小数部がために、実際にはオプションです例:

var n = 0.; 

0.toStringはあなたにSyntaxErrorを与えるアクセスし、理由です、有効な数値リテラルで、インタプリタは小数部、代わりにs文字を期待します。

も参照してください:

0

変数の値は重要ではありませんが、 "提示される"方法によって構文が有効または無効になる可能性があります。このhighly upvoted answerを参照してください。これはEcmaScriptの構文定義の奇妙なことです。

{}   // empty block 
var o = {}; // empty object 
({});  // empty object 
0,{}  // empty object 

{ foo: 'bar'} // block, `foo` label, 'bar' ExpressionStatement 
var o = { foo: 'bar'}; // object literal, declaring a `foo` property 
         // whose value is 'bar' 

彼らはまったく同じに見えるが、ブロックが評価さです:

関連する問題