2016-10-10 70 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和運算符===時,javascript認爲lvalue可能是一個值或表達式。

在#2中,與#1相同。因此{}被視爲對象字面

在#3中,由於javascript會從右向左評估語句,因此{}被視爲大括號而不是對象字面量。因此#3不起作用,因爲您不會在花括號上獲得toString函數。

在#4中,當您將{}包含在()分組運算符中時,javascript認爲它是一個表達式。因此#4工作,因爲{}被評估爲一個對象字面值並且toString可用。

在#5中,與#3相同。 javascript認爲{}只是一個大括號,因爲沒有表達式或與它。

在#6中,與#4相同。有一個表達式!。因此被評估爲對象

在#7中,與#4相同。有一個賦值運算符,因此被評估爲一個表達式。

+0

它確實是一個塊每個Mozilla文檔:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Object_literals – edward

相關問題