javascript:如果变量不存在则定义变量

时间:2009-04-02 20:40:38

标签: javascript variables

我觉得我想尝试做一些超级简单的事情,但只是对此愚蠢。

我想要做的就是查看先前是否设置了变量,如果它没有,请将其设置为默认值....这是一个示例:

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

所以,一旦你停止嘲笑我的代码......为什么它会覆盖变量而不管是什么?

请保存我的神经;)

13 个答案:

答案 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

基本上,在全局范围内或在函数内部执行代码之前有一个阶段,在该函数中扫描所有varfunction声明的代码(不要与函数表达式混淆) ,但这是另一回事。) 然后,所有这些变量和函数都在当前作用域内声明,之后才会实际运行代码。

无论它们在代码中的位置如何,都会发生这种情况,其范围对应于函数体,而不是语句块。即使你在声明they will still remain "empty" until the declaration is reached again in normal execution flow中为变量设置了一个初始值,也会使这更加直观。

所以当你写:

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

实际发生的是:

  1. 扫描代码以查找var声明。无论是否已声明,embed_BackgroundColor都在此范围内声明。它的初始值是未定义的。

  2. 开始执行代码。运行if语句。变量声明的,但其值未定义,因此条件为true。使用typeof无助于您区分未声明和声明但尚未设置的变量。无论如何它没有任何区别。

  3. 代码的正常流程达到var声明。如果你给变量一个初始值,它现在已经设置好了。在这种情况下没有任何反应。

  4. embed_BackgroundColor设置为值"#F4F4F4"

  5. 所以,底线是:您可以使用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.");
  • 将显示第一个警告语句,“jStuff未定义。”
  • 将显示第二个警告语句,“jStuff已定义。”
  • 最终警告语句将显示指定的警报,然后该字符串将存储在str变量中。

答案 10 :(得分:0)

如果ifembed_BackgroundColor false0""nullundefined,则会执行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){
}