代码之家  ›  专栏  ›  技术社区  ›  Morgan Cheng

为什么javascript语句“ga=ga[]有效?

  •  7
  • Morgan Cheng  · 技术社区  · 14 年前

    下面的javascript语句将导致错误,如果 遗传算法 未声明。

    if (ga)
    {
       alert(ga);
    }
    

    错误是:

    ga is not defined
    

    看起来在bool表达式中无法识别未声明的变量。那么,为什么下面的陈述有效呢?

    var ga = ga || [];
    

    对我来说,GA被视为“”之前的bool值。如果为假,则将“”后的表达式分配给最终GA。

    6 回复  |  直到 14 年前
        1
  •  3
  •   YOU    14 年前

    编辑 :您需要使用 var ga; 第一个或 var ga = ga || []; ,因为它首先声明GA并将值赋给它。

    你可以试试这个

    var x = 1, y = x + 1;
    alert([x,y]) // 1,2
    

    您可能会注意到,当y是declare时,x已经声明并且已经分配了1。

    所以,在你的情况下,什么时候 ga || [] 赋值,已声明GA及其有效变量。

        2
  •  4
  •   Kenneth J    14 年前

    null或defined是javascript中的虚值(隐式计算为false)。运算符返回第一个不计算为false的值。

    var x = 0 || "" || null || "hello" || false; // x equals "hello"
    

    另一方面,&operator将返回第一个错误值或最后一个值。

    var y = "a string" && {"attr":"an object"} && false && ["array"]; 
    // y equals false
    
    var z = "a string" && {"attr":"an object"} && ["array"]; 
    // z equals ["array"] 
    
        3
  •  1
  •   MDCore Dai Qizhi    14 年前

    可能是一个不那么奇怪的选择:

    if (typeof ga !== 'undefined') 
    {
       alert(ga);
    }
    
        4
  •  1
  •   user166390    14 年前

    这在使用“var”的情况下有效,因为在作用域解析中创建了变量stop。 如果没有“var”,您只需查看范围链,然后被告知 . 如果你 真的很想 要使用全局变量:

    // This is fine because assignment always sets a property value
    // in this case (no 'var ga') it's the same as window.ga = window.ga || []
    ga = window.ga || []
    

    或:

    // Once again, only the lookup is affected with "running off"
    // the lookup chain. It's not that the variable has no value --
    // the problem is there IS NO VARIABLE.
    if (!window.ga) {
      ga = []
    }
    

    甚至这个:

    // First line is the same as window.ga = window.ga,
    // but now the property ga is guaranteed to exist on the window object --
    // the VALUE of the property may (still) be undefined
    ga = window.ga
    ga = ga || []
    

    注意,在这两种情况下,我都显式地调用了 ga 作为 window (全局)对象。

    您可以在此处阅读有关详细信息: Identifier Resolution, Execution Contexts and Scope Chains .

    这个 安置 范围内的VaR不重要。以下各项均相同:

    var ga
    ga = ga || []
    
    var ga = ga || []
    
    ga = ga || []
    var ga
    
        5
  •  0
  •   CMircea    14 年前

    在第二条语句中,检查GA是否定义,如果为真,则将其分配给自己。否则它会被分配一个空值。

        6
  •  0
  •   kennebec    14 年前

    您希望b是一个数组, 可能您想在B上使用数组方法 或者从中读取索引值。

    var b= s.match(/\d+/) || [];
    return b[0];
    

    这将返回匹配的文本或未定义的文本-

    如果没有空数组赋值,如果没有匹配,第二行将抛出一个错误。