2012-04-04 87 views
7

通常,當我要檢查的對象的類型(無論它是一個數組,一個節點列表,或其他),我用的是以下幾點:爲什麼`{} .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

你忘了()in toString()? – kappa 2012-04-04 07:02:19

+0

不,請參閱@Ray Toal的答案。添加括號會導致語法錯誤(Object沒有方法'apply')。 – 2012-04-04 07:13:28

+0

啊..我沒想到,這是正確的 – kappa 2012-04-04 07:19:38

回答

16

當您開始使用{時,JavaScript會認爲它啓動了一個塊語句,而不是對象文本。將它括起來,你會沒事的。

+0

哦,對,'({})。toString.apply(arr)'工作!非常感謝:) – 2012-04-04 07:02:56

+2

@Ray Toal - +1 but: var arr = [] ({}).toString.apply(arr)// TypeError:object is not a function' 工作代碼必須包含分號';'在每行之後 'var arr = []; ({})。toString.apply(arr); //正常工作 – 2012-04-04 07:10:02

+0

我沒有使用分號,因爲我信任ASI :)但是當然如果你用括號開始你的行(這是邊緣情況之一),你必須指定它。 – 2012-04-04 07:11:15