2013-03-20 83 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