2012-04-04 7 views
7

通常、私は、オブジェクトの種類を(それは、配列、のNodeList、または任意のかどうか)確認したいとき、私は次のようにします。`{} .toString.apply(array)`が動作しないのはなぜですか?

var arr = [] // I don't do this, but it's for the sake of the example 
var obj = {} 
obj.toString.apply(arr) // This works 

質問です:私はなぜないでき以下?

var arr = [] 
{}.toString.apply(arr) // Syntax error: Unexpected token . 

私は構文エラーがどこにはありません。

私は、しかし、次の作品を[]と近づいて何かを行うことができます:

var nodeList = document.getElementsByClassName('foo') 
[].forEach.call(nodeList, function(bar) { console.log(bar) }) // Works 

だから... ...私は混乱しています。

+0

あなたはtoString()を忘れましたか? – kappa

+0

いいえ、@ Ray Toalの答えをご覧ください。括弧を追加すると、構文エラーが発生します(オブジェクトには 'apply'メソッドがありません)。 –

+0

ああ..私はそれが正しいとは思わなかった。 – kappa

答えて

16

{で行を始めると、JavaScriptはオブジェクトのリテラルではなくブロック文を開始すると考えます。それを括弧でくくって、あなたは大丈夫です。

+0

ああ、 '({})。toString.apply(arr)'はうまくいきます!ありがとうございました:) –

+2

@Ray Toal - +1しかし: 'var arr = [] ({})。toString.apply(arr)// TypeError:オブジェクトは関数ではありません。 ' 作業コードにはセミコロン各行の後の ';' 'var arr = []; ({})。toString.apply(arr); // works OK ' –

+0

私はASIを信頼しているのでセミコロンは使用していません:)もちろん、括弧で行を始める場合は指定する必要があります(これはエッジケースの1つです)。 –

関連する問題