javascript:定义一个variables,如果它不存在

我觉得我试图做一些非常简单的事情,但只是愚蠢的。

我想要做的就是看一个variables是否已经被设置,如果它没有,设置它的默认值….这里是一个示例:

if(!embed_BackgroundColor) { var embed_BackgroundColor; embed_BackgroundColor = "#F4F4F4"; } 

所以,一旦你停止嘲笑我的代码….为什么它覆盖variables不pipe是什么?

请救我的神经;)

 if (typeof variable === 'undefined') { // variable is undefined // eg: // var variable = "someValue"; } 

专业风格:

 var SomeVar = SomeVar || 'Default Value'; 

在这种情况下使用三元运算符将是一个很好的编码实践。 与typeof相比,你也不需要有三个等号。 这是最简洁的解决scheme:

 b = typeof(b) == 'undefined' ? 0 : b; 

希望这会挽救你的手一些时间。

要真正回答你为什么会发生这样的问题 – 仅仅是两年多一个月的时间:D – ,这是因为variables提升 。

基本上,在全局范围内执行代码之前,或者在代码被扫描所有的variables和function声明(不要与函数expression式混淆,但这是一个不同的故事)的函数内部有一个阶段。
所有这些variables和函数都是在当前范围内声明的, 之后才实际运行代码。

无论在代码中的位置如何,这都会发生,范围对应于函数体,而不是语句块。 而且,即使你在声明中为variables设置了一个初始值, 它们仍然是“空的”,直到在正常执行stream程中再次达到声明为止,这更加违反直觉。

所以当你写:

 if(!embed_BackgroundColor) { var embed_BackgroundColor; embed_BackgroundColor = "#F4F4F4"; } 

实际情况是这样的:

  1. 代码被扫描为var声明。 embed_BackgroundColor在这个范围内声明,不pipe它是否已经声明。 它的初始值是未定义的。

  2. 代码的执行开始。 if语句运行。 variables声明,但是它的值是未定义的,所以条件是真的。 使用typeof将无助于在这里区分未声明和已声明但尚未设置的variables。 反正也没有区别。

  3. var声明是通过代码的正常stream程来达到的。 如果你已经给variables初始值,现在就已经设置好了。 在这种情况下,没有任何反应

  4. embed_BackgroundColor被设置为值"#F4F4F4"

所以,底线是:您可以使用typeof variable == 'undefined'在其他答案中看到,甚至可以像最初使用的那样使用简单的'!variable',但是不要使用var或者会毁掉所有的东西。

我更喜欢这个语法:

embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

不能比这更简单! 即使它已经var'd似乎工作。

如果这是一个全局variables,我喜欢这样做:

 var defineMe = window.defineMe || 'I will define you now'; 

使用窗口命名空间很重要,因为引用未定义的variables将导致非常糟糕的错误,但引用未定义的属性将不会。

如果embed_BackgroundColor是一个未被传递的函数中的参数,则可以使用默认值

 embed_BackgroundColor ? embedBackgroundColor : embed_BackgroundColor = "#F4F4F4"; 

全function的例子

 function colorFunctionThing(embed_BackgroundColor) { embed_BackgroundColor ? embed_BackgroundColor : embed_BackgroundColor = "#F4F4F4"; console.log(embed_BackgroundColor); }; colorFunctionThing(); 

输出

 #F4F4F4 

不完全是你要找的东西,但还是很好的知道。

我跟随Chris West的博客,看到他在http://gotochriswest.com/blog/2012/07/02/javascript-define-if-undefined/上发布了一个很酷的方法。;

基本上,你有define函数的define ,然后像这样使用它:

 define("embed_BackgroundColor", "#F4F4F4"); 

上面的代码将在全局上下文中定义enbed_BackgroundColor(如果尚未定义的话)。 Chris使用的例子更有用一些,如下所示:

 alert("jStuff is " + (typeof jStuff == "undefined" ? "un" : "") + "defined."); define("jStuff.alert", function(msg) { alert(msg); return msg; }); alert("jStuff is " + (typeof jStuff == "undefined" ? "un" : "") + "defined."); var str = jStuff.alert("Show and save this message."); 
  • 第一个警报语句将显示“jStuff未定义”。
  • 第二个警报语句将显示“jStuff已定义”。
  • 最后的警报语句将显示指定的警报,然后该string将存储在strvariables中。

我认为你的发表的代码应该工作。 除非你的原始值是0。

问题在别的地方。

我猜你定义了“embed_BackgroundColor”超出了你的代码范围。 而当你运行你的代码时,这个variables在你的代码范围内是未定义的,并且将被赋予默认值。

这里是一个例子:

 var embed_BackgroundColor = "#FF0000"; (function(){ if(!embed_BackgroundColor) { var embed_BackgroundColor; embed_BackgroundColor = "#F4F4F4"; } alert(embed_BackgroundColor); // will give you #F4F4F4 })(); alert(embed_BackgroundColor); // will give you #FF0000; 

我更喜欢PHP风格的一般解决scheme:

function isset(x) { return typeof(x)!='undefined'; }

因为如果embed_BackgroundColorfalse ,你的if块将被执行, 0""nullundefined或者NaN

embed_BackgroundColor不应该被覆盖,如果它已经被分配给另一个非空的string …或者至less,它不在我的最后。

正如钱其琛指出的,这也许是一个矛盾的例子。

最佳select:

 if (typeof someVar === 'undefined') someVar = someValue;