Javascript: 这是一个条件赋值语句吗?

15

从 Google Analytics 的跟踪代码中:

var _gaq = _gaq || [];

这是如何工作的?

这是一个条件变量赋值吗?与这样说是一样的吗:

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

?


可能是What does the || operator do?的重复问题。 - Felix Kling
简短回答:是的(尽管第二个会创建一个全局 _gaq *编辑:如果我们假设 _gaq 不存在)。 - Felix Kling
@Felix - 除非其他范围适用于“_gaq”,否则请勿更改它的作用域。 - Quentin
我想补充一点,鉴于这个问题的具体情况,这两个语句的区别在于你不能使用前者的语法来有条件地定义全局变量,因为它会抛出引用错误。 - Andrew Hubbs
值得注意的是,如果您有意将 _gaq 设置为假值(如 0),那么它将被重新分配为 [] 的值。因此,它的行为不完全像 Ruby 中的条件赋值。 - steve
4个回答

15

或运算符(||)将返回左侧内容,如果它是一个true值,否则将返回右侧内容。

这与您的第二个示例非常相似,但由于使用了var关键字,它还为变量建立了一个局部作用域。


5

是的,没错。

|| 运算符会对其最左边的"真值"操作数进行求值。
如果 _gaq 是"假值"(比如 null, undefined, 或者 0),它就会求值为右边的表达式([])。


3
或者 false 或者 ""(空字符串)。 - Russ Cam

2

这句话的意思是:

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

这可以通过将变量提升到条件检查之前来实现,从而避免“未定义”错误,并且还会自动将_gaq视为本地范围。


1
实际上,这并是说:
if (!_gaq) _gaq = [];

至少不一定。考虑一下:

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

  inner();
  _gaq = 1;
  inner();
}

当外部词法作用域中存在"_gaq"(顺便说一下,我讨厌打那个),你最终得到的是内部作用域中的一个变量。 "if"语句的不同之处在于这种非常重要的方式 - 在这种情况下只会有一个"_gaq"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接