我觉得我想尝试做一些超级简单的事情,但只是对此愚蠢。
我想要做的就是查看先前是否设置了变量,如果它没有,请将其设置为默认值....这是一个示例:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
所以,一旦你停止嘲笑我的代码......为什么它会覆盖变量而不管是什么?
请保存我的神经;)
答案 0 :(得分:75)
专业风格:
var SomeVar = SomeVar || 'Default Value';
答案 1 :(得分:58)
if (typeof variable === 'undefined') {
// variable is undefined
// eg:
// var variable = "someValue";
}
答案 2 :(得分:44)
在这种情况下使用三元运算符将是一个很好的编码实践。与typeof相比,你也不需要有三个相同的符号。这是最简洁的解决方案:
b = typeof(b) == 'undefined' ? 0 : b;
希望能节省你的手。
答案 3 :(得分:28)
要真正回答你为什么会这样做的问题 - 这只是两年零一个月:D - ,这是因为variable hoisting。
基本上,在全局范围内或在函数内部执行代码之前有一个阶段,在该函数中扫描所有var
和function
声明的代码(不要与函数表达式混淆) ,但这是另一回事。)
然后,所有这些变量和函数都在当前作用域内声明,之后才会实际运行代码。
无论它们在代码中的位置如何,都会发生这种情况,其范围对应于函数体,而不是语句块。即使你在声明they will still remain "empty" until the declaration is reached again in normal execution flow中为变量设置了一个初始值,也会使这更加直观。
所以当你写:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
实际发生的是:
扫描代码以查找var
声明。无论是否已声明,embed_BackgroundColor
都在此范围内声明。它的初始值是未定义的。
开始执行代码。运行if
语句。变量是声明的,但其值未定义,因此条件为true。使用typeof
无助于您区分未声明和声明但尚未设置的变量。无论如何它没有任何区别。
代码的正常流程达到var
声明。如果你给变量一个初始值,它现在已经设置好了。在这种情况下没有任何反应。
embed_BackgroundColor
设置为值"#F4F4F4"
。
所以,底线是:您可以使用typeof variable == 'undefined'
,如其他答案所示,或者甚至是您最初使用的简单'!variable',但不要使用var
或那个会破坏一切。
答案 4 :(得分:10)
我更喜欢这种语法:
embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"
不能比这简单得多!它似乎工作,即使它已经变成了。
答案 5 :(得分:10)
如果它是一个全局变量,我喜欢这样做:
var defineMe = window.defineMe || 'I will define you now';
使用窗口命名空间非常重要,因为引用未定义的变量会导致非常糟糕的错误,但引用未定义的属性则不会。
答案 6 :(得分:1)
如果embed_BackgroundColor是未通过的函数中的参数,则可以使用
设置默认值embed_BackgroundColor ? embedBackgroundColor : embed_BackgroundColor = "#F4F4F4";
全功能示例
function colorFunctionThing(embed_BackgroundColor) {
embed_BackgroundColor ? embed_BackgroundColor : embed_BackgroundColor = "#F4F4F4";
console.log(embed_BackgroundColor);
};
colorFunctionThing();
输出
#F4F4F4
不完全是你想要的,但仍然很高兴知道。
答案 7 :(得分:0)
我认为您发布的代码应该有效。除非您的原始值为0。
问题出在其他地方。
我猜你在代码范围之外定义了'embed_BackgroundColor'。当您运行代码时,在代码范围内未定义该变量,并将为其分配默认值。
以下是一个例子:
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;
答案 8 :(得分:0)
我更喜欢类似PHP的通用解决方案:
function isset(x)
{ return typeof(x)!='undefined'; }
答案 9 :(得分:0)
我关注了Chris West的博客,看到他在http://gotochriswest.com/blog/2012/07/02/javascript-define-if-undefined/发布了一个非常酷的方式。
基本上,你有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.");
str
变量中。答案 10 :(得分:0)
如果if
为embed_BackgroundColor
false
,0
,""
,null
,undefined
,则会执行NaN
阻止,或embed_BackgroundColor
。
但{{1}}如果已经被分配到另一个非空字符串,则不应该被覆盖...或者至少,它不在我的最后。< / p>
正如Aaron Qian指出的那样,也许这是范围冲突的情况。
答案 11 :(得分:0)
最佳选择:
if (typeof someVar === 'undefined') someVar = someValue;
答案 12 :(得分:-1)
if(embed_BackgroundColor == "" || embed_BackgroundColor == 'undefined' || embed_BackgroundColor == null){
}