2012-11-22 29 views
2

這可能是重複的,但我不知道如何搜索它。分配現有或空的對象

爲什麼

var test = test || {}; 

工作,但

var test = testing || {}; 

拋出一個錯誤?在定義時,testtesting都未定義。

編輯

拋出的錯誤是「引用錯誤:測試沒有定義」

+0

@MattLin:可是我沒有定義'test'要麼,還是我? – Amberlamps

+0

+1好問題 – paragy

+0

@nozzleman:什麼?只需複製並粘貼'var test = testing || {};'到您的控制檯。 – Amberlamps

回答

3

從不存在的意義上說,未定義的變量與保存值undefined的變量之間存在差異。

在你的第一個例子中,你聲明testvar這樣,當在=右側的表達式求值的變量test存在,但有值undefined

在你的第二個例子中,你根本沒有定義testing,因此錯誤。

編輯:它發生在我身上,也許進一步的解釋不會傷害。

爲了簡化,JavaScript引擎需要兩遍代碼。第一遍是解析/編譯階段,然後發生變量聲明但未分配。第二遍是實際執行,然後是分配發生。這導致了一種通常稱爲「變量提升」的效應 - 就好像JS引擎將聲明「提升」到其範圍的頂部,但仍然執行了任務。

這樣才能代碼這樣的地步:

var test = test || {}; 

...它基本上是說「難道test已經與truthy值:如果有則使用它,否則將其設置爲一個新的空?目的。」如果相同的變量聲明不止一次在同一範圍內

JS引擎不介意 - 它基本上忽略了第二聲明,但不會忽略包含在第二個聲明任何分配。因此,如果test在某個其他腳本塊中聲明,可能是在一個單獨的JS包含文件中,那麼該行只會將test分配給它自己(假設它有一個真值,其中所有對象都是真實的)。但是,如果它沒有在別處聲明,它將仍然存在,因爲當前的var聲明,但在當前賦值之前它將爲undefined,因此||運算符返回右側操作數{}

+1

'在不存在的意義上未定義的變量和保存未定義值的變量之間存在差異。 。這是線。 +1 – Jashwant

+0

相關答案bro ..謝謝 – Akhil

1

這是由於var關鍵字。 因爲聲明瞭變量,所以它也存在,儘管值未定義。 ||然後做的是檢查是否真實,當它發現對象未定義時,它會給你一個新的對象來處理。

後者完全相同,但由於您在「一行」上執行此操作,因此testing對象在評估時未定義,因此會拋出異常。

1
var test = test || {}; 

這裏,test一直declared但不defined

但是,

var test = testing || {}; 

有沒有testing任何引用,你還在試圖轉讓其價值。

對於第一種情況對應的代碼會是這樣,

var testing; // See testing is still undefined 
var test = testing || {};