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"; }
实际情况是这样的:
-
代码被扫描为
var
声明。embed_BackgroundColor
在这个范围内声明,不pipe它是否已经声明。 它的初始值是未定义的。 -
代码的执行开始。
if
语句运行。 variables被声明,但是它的值是未定义的,所以条件是真的。 使用typeof
将无助于在这里区分未声明和已声明但尚未设置的variables。 反正也没有区别。 -
var
声明是通过代码的正常stream程来达到的。 如果你已经给variables初始值,现在就已经设置好了。 在这种情况下,没有任何反应 -
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将存储在
str
variables中。
我认为你的发表的代码应该工作。 除非你的原始值是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_BackgroundColor
为false
,你的if
块将被执行, 0
, ""
, null
, undefined
或者NaN
。
但embed_BackgroundColor
不应该被覆盖,如果它已经被分配给另一个非空的string …或者至less,它不在我的最后。
正如钱其琛指出的,这也许是一个矛盾的例子。
最佳select:
if (typeof someVar === 'undefined') someVar = someValue;