2013-03-20 85 views
5

我希望創建一個帶有嵌套變量的Javascript對象,其中一些變量不會指定默認值。聲明無值的變量

目前,我有這樣的:

var globalVarA = "foo"; 
var globalVarB = "bar"; 
var globalVarC; 

function myFunction(){ 
    //do something 
} 

我希望這個更改爲:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

不過,我得到以下錯誤:

Expected ':'

我怎樣才能宣佈這個變量沒有價值?

這是最佳實踐還是有其他更好的解決方案?

回答

12

如果要定義變量爲GlobalVars性能,你必須明確指定undefined他們

GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 

您的代碼包含無效的符號,使用對象的文字符號時,必須指定每個變量的值。這與XML或formParams等其他符號不同,您可以在不設置它的情況下聲明屬性/屬性。

請注意,在我的解決方案中,未定義的變量會得到一個默認值 - 該值只是原始值undefined,這是默認情況下未定義變量的返回值。

然而,你的變量確實得到定義,如果你做globalVarC: undefined

GlobalVars.globalVarC;//undefined 
GlobalVars.globalVarX;//undefined 
GlobalVars.hasOwnProperty("globalVarC");//true 
GlobalVars.hasOwnProperty("globalVarX");//false 

spec

4.3.9 undefined value:

primitive value used when a variable has not been assigned a value.

+0

只是在側面說明。直到需要時才聲明'globalVarC'會有什麼缺點?既然你可以設置'GlobalVars.globalVarC =「任何」;「即使它沒有被宣佈。 – 2013-03-20 12:52:31

+1

@TimBJames這是一個很好的問題。例如,這個差異可以用'hasOwnProperty'檢查來表示。就個人而言,如果它只是用於該函數,在我自己的代碼中,我會執行'GlobalVars.globalVarC'而不是明確地將其設置爲undefined。 – 2013-03-20 12:54:11

+0

是的,我可能也會去,因爲如果你正在檢查變量的存在,你會檢查'if(GlobalVars。globalVarC!= undefined)'這將是這種情況。 – 2013-03-20 13:31:37

1

您需要爲globalVarC否則對JSON的JavaScript語法指定的值會是錯誤的,因爲你沒有任何價值初始化你可以給價值undefined

undefined是一個具有基元值的全局變量undefined

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 
0

你會希望undefined原始值是默認值:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: void 0 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

void 0表達給出undefined的價值,無論undefined是否被「改道」。

+0

只是想知道..不是那個調用值爲0的JS編譯器?我從來沒有真正明白你爲什麼要改變未定義的價值。在同樣的思路中,可以改變Function.prototype.call的值。你會自己在生產代碼中執行此操作嗎?它提供了什麼優勢?我希望這不會成爲侵略性的,我真的很感興趣你爲什麼這麼做。 – 2013-03-20 12:51:30

+0

@BenjaminGruenbaum你是什麼意思「調用編譯器的值0」?至於改變'undefined',當然沒有人有充足的理由這樣做;-) – 2013-03-20 12:53:37

+0

'void'運算符在下面的表達式中調用JavaScript編譯器(在這種情況下,'0'被轉換爲'「0」'和返回'undefined')。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void。在這種情況下,調用編譯器似乎有點極端。即使'globalVarC:(function(){var a; return a;})()'看起來更清晰。我會做一個性能:) – 2013-03-20 12:56:25