2011-12-31 4 views
1

{}objectの場合、例えば、{}"string",{}[1, 2, 3]または{}({})は、objectと正確に等しい(===による)。 "string"[1, 2, 3]、または({})の場合、前者ではなく後者で変数を定義できますか?"{}オブジェクト"を含む変数を定義します。予期しないタイプエラー

明確にする:この文脈で

{}"string" === "string" // true 
var a = "string"  // No error 
var a = {}"string"  // SyntaxError: Unexpected string 
var a = ({}"string") // SyntaxError: Unexpected string 
var a = {}("string") // TypeError: object is not a function 
var a = ({}("string")) // TypeError: object is not a function 
+1

これは優れた質問です。 –

+3

人々がこれらがすばらしい質問であると思う理由はわかりません。誰かが実際に書いた実際のコードとは何が関係していますか? – jfriend00

+1

@ jfriend00少なくともそれは本当に有用ではないが、例で非常にはっきりと尋ねられたと思う。 – Wiseguy

答えて

8

を、{}は、空きブロックのような、ないオブジェクトリテラルとして動作しているように見えます。だから、構文上のようなことを考える:

// Valid syntax... 
// despite confusing whitespace... 
for (var i=0;i<5;i++) {}"string" === "string"; 

しかし、空のブロックは、ここで

var a = {}"string"; //SyntaxError 

など代入の右側に使用することはできません、{}(){}として使用されていることを意味していることこの関数は、JavaScriptで()

var a = {}("string") // TypeError: object is not a function 
+0

迅速かつ明確に説明された回答をありがとう。 {{}}は 'new Object'と似た魔法のコンストラクタとして動作していたのですが、代わりにリテラルを生成していると私は思っていました。明らかにJavaScriptの複雑さに関する私の知識は非常に限られています。 –

4

内部のパラメータを指定して、C++のように、あなたは、任意に配置されたコードブロックを持つことができますプログラム。 Javascriptはブロックスコープを持たないので、C++のように、これはJavascriptでは基本的に役に立たない。声明の中に置くことはできませんので、これらの孤独なコードブロックは、表現でないこと

{ 
    //this is a code block 
    var a = 1; 
    var b = a + 1; 
} 
alert(a); // 1 
alert(b); // 2 

注:ここでは

は、空でないコードブロックの一例です。これはなぜvar a = {}"string"とそれを文の中で他の用途が構文的に有効でないのかを説明します。コンソールで

{}"string" === "string"戻りtrue{}は明らかtrueある"string" === "string"続い無視され、空のコードブロックは、、、であるからです。あなたはこのように空白を使用する場合は、コードが明確である:

式の内部
{ 
    //empty code block 
} 
"string" === "string" 

{}はオブジェクトリテラルとして解釈されます。 {}()のようなものを試してみると、{}は機能ではないと不平を言うでしょう。

+0

ああ、私はJavascriptのこの機能を認識していませんでした。コンソールの '{}'がなぜ 'undefined 'に評価されるのか分かりました。中かっこで中括弧を囲んだ後で、それがオブジェクトリテラルとして扱われる理由は何ですか? –

+2

@Ian Javascriptでいくつかのコードのまわりにかっこを置くと、それはパーサに、かっこの中身が式として解釈されるように指示します。孤独なコードブロックは式の中に置くことができないので、オブジェクトリテラルでなければなりません。 –

関連する問題