2011-11-30 152 views
3

我有這樣的代碼在JavaScript:這段JavaScript代碼在做什麼?

var JSON; 
JSON||(JSON={}); 

你能告訴一下這個代碼是幹什麼的?

+0

如果是這樣的片段完全相同,那麼它是做'VAR JSON = {}的很婉轉地;',它會創建一個新的對象,並將其分配給變量'JSON'。 – Ryan

回答

1

它的作用域是一個變量,稱爲JSON,然後使用||運算符的短路屬性爲空分配一個空對象,除非該變量具有真值。

+0

「truthy」 - 大聲笑! – BentOnCoding

+2

@Robotsushi - 這就是它所謂的。這些也是錯誤的。 –

+0

@Robotsushi:這不是官方任期嗎? – Ryan

0

它只是使JSON一個空的對象。

0

我認爲這是說:如果var'JSON'爲null,則創建一個空的javascript obect。

+0

不。它測試它是否爲'null'或'undefined'或任何其他falsy值。如果它是分配一個JavaScript對象。這裏沒有JSON(除了名稱變量很少)。 – Quentin

4

var JSON正在聲明一個全局(或其他範圍)變量。

JSON||(JSON={});首先檢查是否JSON評估爲true或false,如果爲false,則JSON設置爲空對象;

+0

它不檢查它是否有價值。它可能有'false','0','''''或其他許多事物,並且仍然會分配一個空對象。 – Quentin

+0

@Quentin - oops「有一個值,如果不是」應該是「評估爲真或假,如果爲假」 – mrk

2

正是在這種情況下相當無意義,

var JSON; 

創建一個名爲JSON

第二部分變量,

JSON||(JSON={}); 

相當於

if(!JSON){ 
    JSON = {}; 
} 

這些都可以跳過,寫爲

var JSON = {}; 
+0

如果您跳過測試,那麼您將總是覆蓋它所包含的任何內容。在任何情況下,如果有人打算檢查變量是否具有真值,那通常不是一件好事。 – Quentin

+0

@Quentin只適用於集合之前有更多的代碼,而沒有。 – Andrew

+0

- 我認爲假設問題中的代碼代表完整的程序可能是不安全的。 – Quentin

0

該代碼被執行以下操作:

  1. 聲明變量JSONJSON === undefined
  2. 分配一個空對象({})到JSON如果JSON是一個虛假的價值。

Falsey值包括:nullundefined""(空字符串),0NaNfalse

JSON已經經由var JSON被聲明,所以被設定爲undefined,這意味着操作的右手側JSON||...執行。換句話說,所有的代碼實現的是:

var JSON = {}; 
+1

它範圍變量。它可能來自其他地方的價值。 – Quentin

+0

@Quentin,正好 - 值必須是'undefined',因爲變量是通過'var JSON'聲明的。如果它在該聲明之前有另一個值,那麼它就沒有關係,因爲'JSON || ..'在那之後運行。 – James

+0

- 不,var'被託管並且不會重置具有前面定義的值的變量。我見過:'function(foo){var foo ...}'很多次。 'var'是多餘的,因爲參數自動在本地作用域。 – Quentin