2016-10-10 17 views
1
> "[object Number]" === Object.prototype.toString.call(1) // #1 
< true 
> "[object Number]" === {}.toString.call(1)    // #2 
< true 
> {}.toString.call(1) === "[object Number]"    // #3 
< SyntaxError: Unexpected token '.' 
> ({}).toString.call(1) === "[object Number]"    // #4 
< true 
> {}.toString.call(1)          // #5 
< SyntaxError: Unexpected token '.' 
> !{}.toString.call(1)         // #6 
< false 
> test = {}.toString.call(1)        // #7 
< "[object Number]" 

サンプルからわかるように、#2と#3は、左右が入れ替わっている以外はほぼ同じです。 #2は正常に動作しますが、#3は構文エラーです。 #3を動作させるには、一対の括弧が必要です。さらに、#5-7から、{}が一番左にない限り、正常に動作することがわかります。シンタックス空のオブジェクトの属性に直接アクセスしたときのエラー

なぜですか?

+1

'{}'はオブジェクトリテラルであり、変数には割り当てられていないと考えられます。したがって、まだオブジェクトに初期化されていません。スコープ – Rajesh

+3

'{}}の可能性を考慮すると、' {} 'はその場合のブロックになります。 – Xufox

+0

@Xufox:なぜそれがブロックですか?コンソールに '{}'と入力すると、オブジェクト '{}'が返されます。また、これはノードではなくデスクトップブラウザでテストされます。 – edward

答えて

0

#1では、rvalueと演算子===が見つかると、lvalueは値または式である可能性があるとみなされます。

#2では#1と同じです。 {}はオブジェクトリテラルと見なされます

#3では、javascriptが文を右から左に評価するため、{}は中括弧とみなされますがオブジェクトリテラルではありません。したがって、中括弧にtoStringの機能が得られないため、#3は機能しません。

#4では、{}()グルーピング演算子内に囲むと、javascriptはそれが式であると考えます。したがって、#4は、{}がオブジェクトリテラルとして評価され、toStringが利用可能であるために機能します。

#5では#3と同じです。 javascriptでは、式がないか、それがあるため、{}を単なるブレースと考えています。

#6では#4と同じです。式!があります。オブジェクトとして評価されます

#7、#4と同じです。代入演算子があるため、式として評価されます。

+0

実際ブロックMozilla doc:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Object_literals – edward

関連する問題