【问题标题】:javascript: is this a conditional assignment?javascript:这是一个条件赋值吗?
【发布时间】:2011-09-04 07:16:51
【问题描述】:

来自谷歌分析跟踪代码:

var _gaq = _gaq || [];

这是如何工作的?

是条件变量赋值吗? 是不是和说的一样:

if( !(_gaq) ) {_gaq = []; }

?

【问题讨论】:

  • 简短回答:是的(尽管如果我们假设 _gaq 不存在,第二个会创建一个全局 _gaq edit:)。
  • @Felix — 除非有其他东西将不同的范围应用于 _gaq
  • @Quentin:没错,我编辑了我的评论。
  • 我要补充一点,鉴于此问题的具体情况,这两个语句的不同之处还在于,您不能使用前者的语法有条件地定义全局变量,因为它会引发引用错误。跨度>

标签: javascript


【解决方案1】:

同说:

if( !(_gaq) ) {var _gaq = [];}

(可以这样做,因为 var 被提升到条件检查之上,从而避免了“未定义”错误,并且还会导致 _gaq 在范围内被自动视为本地。)

【讨论】:

    【解决方案2】:

    其实和说的一样:

    if (!_gaq) _gaq = [];
    

    至少不一定。考虑一下:

    function outer() {
      var _gaq = null;
      function inner() {
        var _gaq = _gaq || [];
        // ...
      }
    
      inner();
      _gaq = 1;
      inner();
    }
    

    当在外部词法范围内有一个“_gaq”(顺便说一下,我讨厌输入它)时,您最终会在内部范围内得到一个 new 变量。 “if”语句的不同之处在于非常重要的一点——在这种情况下,只有一个“_gaq”。

    【讨论】:

      【解决方案3】:

      是的。

      || 运算符求值到其最左边的“真实”操作数。
      如果_gaq 为“假”(例如nullundefined0),它将计算到右侧([])。

      【讨论】:

      • false""(空字符串)
      【解决方案4】:

      or 运算符 (||) 如果为真值则返回左侧,否则返回右侧。

      它与您的第二个示例非常相似,但由于它使用了var 关键字,它还为变量建立了一个本地范围。

      【讨论】:

        猜你喜欢
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        • 2018-06-25
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        相关资源
        最近更新 更多