Javascript || 或具有未定义变量的运算符

bry*_*mon 31 javascript

我最近在做一些阅读,我读过的一篇文章来自Opera.

http://dev.opera.com/articles/view/javascript-best-practices/

在那篇文章中他们写道:

JavaScript中的另一个常见情况是,如果未定义变量,则为变量提供预设值,如下所示:

if(v){
  var x = v;
} else {
  var x = 10;
}
Run Code Online (Sandbox Code Playgroud)

这个快捷符号是双管道字符:

var x = v || 10;
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我不能让这个为我工作.是否真的可以检查是否定义了v,如果不是x = 10?

- 谢谢.布赖恩

use*_*716 56

那篇Opera文章很难描述正在发生的事情.

虽然这是事实,x将得到的值10,如果vundefined.这也是事实,x将是10,如果v任何 "falsey"值.

javascript中的"falsey"值为:

  • 0
  • null
  • undefined
  • NaN
  • "" (空字符串)
  • false

所以,你可以看到,有很多情况下,x将被设置为10除了刚才undefined.

这里有一些详细说明逻辑运算符的文档.(这是"逻辑OR".)它给出了几个用于这种赋值的例子.

快速示例:http://jsfiddle.net/V76W6/

var v = 0;

var x = v || 10;

alert( x ); // alerts 10
Run Code Online (Sandbox Code Playgroud)

分配v我在上面指出的任何虚假值,您将得到相同的结果.

  • 另一种描述受影响的方法是:http://jsfiddle.net/robertpitt/V76W6/1/ (2认同)

Ple*_*and 11

var x = v || 10;
Run Code Online (Sandbox Code Playgroud)

该运算符("逻辑"或"短路"OR运算符)通常会检查其值v,如果它是一个"虚假"值(它将作为if语句中使用的条件失败),则10成为该值的x,否则v它(如果10是一个函数,它永远不会被执行).

undefined,null和,0都是变量可以容纳的虚假值的例子(是的,甚至是第一个),并且运算符(或if语句)相应地起作用.相比之下,所有对象和数组(不包括null)都是"truthy"值,这允许这样的事情(在Google Analytics跟踪器代码中使用):

var _gaq = _gaq || []; // Makes a new array _gaq if it is not already there
Run Code Online (Sandbox Code Playgroud)

但是,如果引用的变量甚至未在作用域链中的任何位置声明,则会发生JavaScript异常.

避免这种情况的一种方法是从一开始就声明所有的全局变量:

var iAmAGlobalVariable;  // Holds the value undefined by default
Run Code Online (Sandbox Code Playgroud)

如果无法做到这一点,您应该使用typeof运算符.它不会尝试评估其操作数,因此不会发生异常:

var x;
if(typeof v != 'undefined' && v) {
    x = v;
} else {
    x = 10;
}
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,如果您知道变量将是一个全局变量,您可以将其视为全局(窗口)对象的属性:

var x = window.v || 10;
Run Code Online (Sandbox Code Playgroud)


Tha*_*hai 6

如果v计算结果为假(例如0,null,false),那么它将无法工作.您可以手动检查undefined:

var x = v !== undefined ? v : 10;
Run Code Online (Sandbox Code Playgroud)