【问题标题】:javascript: define a variable if it doesn't existjavascript:如果变量不存在,则定义一个变量
【发布时间】:2009-04-02 20:40:38
【问题描述】:

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

我要做的就是查看之前是否设置了变量,如果没有设置,则使用默认值设置它....这里是一个示例:

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

所以,一旦你停止嘲笑我的代码......为什么无论如何它都会覆盖变量?

请拯救我的神经;)

【问题讨论】:

    标签: javascript variables


    【解决方案1】:

    专业风格:

    var SomeVar = SomeVar || 'Default Value';
    

    【讨论】:

    • :\ 这不会将SomeVar 重新分配给它自己吗?事实上,它看起来像“专业”风格,但它确实 - 事实上 - 似乎有些未优化(尤其是 for/while 循环)。我会坚持一个如果。但是,我可能是错的,解释器可能会认识到它不需要将 var 存储回 本身
    • 一句警告:如果SomeVar 可以是一个假-y 值,这将失败。 ''false0 之类的东西会触发 || 并设置默认值Jhuni 回答(但使用 var 关键字,就像这个一样)。也同意@dylnmc,这会导致不必要的重新分配。 @Paolo Berantino 有我认为是“正确”的答案。我个人强烈反对“小巧紧凑”就是“专业风格”。我们不再使用打孔卡,而 js 缩小器将其余部分均等化。
    • 使用这种方法我收到Uncaught ReferenceError: my_var is not defined (Chrome -v 48.0)
    • 这不是很冗长。新程序员将无法立即解码发生的事情。我不会推荐这个。
    • 由于@Fodagus 提到的问题,这个错误的答案和“专业人士”肯定不会这样做。另外我怀疑它在某些 JS 引擎中可能不起作用,具有某些严格的设置或 linter,因为它分配了一个可能不存在的值(这可能是 @popas 的问题)。只需使用正确的方式typeof Somevar === 'undefined' 即可避免所有这些问题。
    【解决方案2】:
    if (typeof variable === 'undefined') {
        // variable is undefined
        // eg:
        // var variable = "someValue";
    }
    

    【讨论】:

    • 问题是不管 // var variable = "someValue" 覆盖了 DID 存在的预定义值
    • 真的是三个=s吗? (我不知道)
    • 我不知道为什么会被接受。似乎使用上面的代码(var variable = "someValue"; 行未注释导致variable 始终等于“someValue”,即使它已经定义。
    • @Mike 如果它已经被定义,你将不会进入 if 条件。
    • @pedz 没关系,因为 'var' 关键字会使 if 中的变量重新定义,即使它从未进入 if 块。 JS 没有“块级范围变量定义”。
    【解决方案3】:

    在这种情况下,使用三元运算符将是一种很好的编码习惯。此外,与 typeof 进行比较时,您不需要三个等号。这是最简洁的解决方案:

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

    希望这可以为您节省一些时间。

    【讨论】:

    • 类似于calmbird 的回复中的评论(如下......也许),看起来 b 在定义时被重新分配给它自己。这似乎在一个循环中可能是糟糕的(不可怕)。同样,我不知道解释器将如何准确处理这个问题,但看起来这将是不必要的重新分配。
    • 我认为必须使用=== 而不是==
    • 这应该是公认的答案,得票最多的答案并不总是有效
    • 应该被接受的答案,因为它不做 dirty 平等检查
    • 遗憾的是,您的回答并不完全正确,因为双等号表示 inter[reter 将自动尝试类型转换。使用a === b 总是会更快,因为这些值是经过严格比较的,省略了一步。
    【解决方案4】:

    要真正回答您关于为什么会发生这种情况的问题 - 仅仅过了两年零一个月 :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 语句运行。声明了变量,但其值未定义,因此条件为真。使用typeof 并不能帮助您在此处区分未声明变量和已声明但尚未设置的变量。反正也没什么区别。

    3. 通过正常的代码流到达var 声明。如果你给变量一个初始值,它现在就会被设置。在这种情况下,什么都不会发生。

    4. embed_BackgroundColor 设置为值"#F4F4F4"

    因此,底线是:您可以使用其他答案中看到的 typeof variable == 'undefined',甚至可以像最初使用的那样使用简单的 '!variable',但不要使用 var,否则会破坏一切。

    【讨论】:

    • 它是否真的处于被声明但评估为“未定义”的状态?我认为 undefined 的全部目的是针对未声明的事物! (即未定义)。你的意思是空吗?
    • @Moss 不,真的是undefined。这是 JS 中未初始化变量的默认值(未初始化我的意思是“没有分配给它们的值”)。只需在 Firebug 上尝试一下:typeof blah 将评估为字符串 'undefined'
    【解决方案5】:

    如果是全局变量,我喜欢这样做:

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

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

    【讨论】:

    • 它只在我添加window 时对我有用,谢谢!
    • 因为var defineMe 的定义被提升了,我认为您不需要使用window. 来访问defineMe,即使它之前没有定义。但是,并不是说如果 defineMe 为 falsey (0, false, "") 它将被分配默认值。为了避免它检查typeof defineMe==='undefined'而不是
    【解决方案6】:

    我更喜欢这种语法:

    embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

    没有比这更简单的了!即使它已被 var'd,它似乎也能工作。

    【讨论】:

    • ReferenceError: embed_BackgroundColor is not defined 需要先定义var embed_BackgroundColor
    【解决方案7】:

    如果 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
    

    不完全是您想要的,但仍然很高兴知道。

    【讨论】:

      【解决方案8】:

      最佳选择:

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

      【讨论】:

        【解决方案9】:

        我认为您发布的代码应该可以工作。除非你的原始值为 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;
        

        【讨论】:

          【解决方案10】:

          我更喜欢类似 PHP 风格的通用解决方案:

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

          【讨论】:

          • 这行不通。它会给你一个参考错误:[x] is not defined.
          • 它可以工作,但你需要记住,如果你不先检查 isset(obj) 然后再检查 isset(obj.arr) isset(obj.arr[x]) 将不起作用)。
          【解决方案11】:

          我关注了 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 变量中。

          【讨论】:

            【解决方案12】:

            因为如果embed_BackgroundColorfalse0""nullundefinedNaN,您的if 块将执行。

            但如果embed_BackgroundColor 已经分配给另一个非空字符串,则不应覆盖它......或者至少,它不会在我这边。

            正如 Aaron Qian 所指出的,这可能是一个范围冲突的情况。

            【讨论】:

              【解决方案13】:
              if(embed_BackgroundColor == "" || embed_BackgroundColor == 'undefined' || embed_BackgroundColor == null){
              }
              

              【讨论】:

              • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-04
              • 2013-08-02
              • 2020-11-18
              相关资源
              最近更新 更多