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

时间:2011-01-02 02:49:45

标签: javascript

我最近一直在阅读一篇我读过的文章来自Opera。

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

在那篇文章中,他们写道:

  

JavaScript中的另一种常见情况   为a提供预设值   变量,如果没有定义,比如   这样:

if(v){
  var x = v;
} else {
  var x = 10;
}
  

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

var x = v || 10;

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

- 感谢。 布赖恩

6 个答案:

答案 0 :(得分:53)

Opera文章对发生的事情描述不佳。

如果x 10v,则undefined的价值为x。如果10具有任何“falsey”值,则v也是0

javascript中的“falsey”值为:

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

因此,除了10之外,您可以看到undefined设置为var v = 0; var x = v || 10; alert( x ); // alerts 10 的情况很多。

Here's some documentation详细说明了逻辑运算符。 (这是“逻辑OR”。)它给出了几个用于这种分配的例子。

简单示例:http://jsfiddle.net/V76W6/

v

分配{{1}}我在上面指出的任何假名值,您将获得相同的结果。

答案 1 :(得分:10)

var x = v || 10;

该运算符("logical" or "short-circuit" OR operator)通常会检查v的值,如果它是“虚假”值(,它会因使用的条件而失败在if语句中,10成为x的值,否则v成为(10如果是函数,则永远不会执行)。

undefinednull0都是变量可以容纳的虚假值的示例(是的,甚至是第一个),运算符(或if语句)的行为因此。相比之下,所有对象和数组(不包括null)都是“truthy”值,允许这样的事情(在Google Analytics跟踪器代码中使用):

var _gaq = _gaq || []; // Makes a new array _gaq if it is not already there

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

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

var iAmAGlobalVariable;  // Holds the value undefined by default

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

var x;
if(typeof v != 'undefined' && v) {
    x = v;
} else {
    x = 10;
}

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

var x = window.v || 10;

答案 2 :(得分:5)

如果v评估为false(例如,0nullfalse),那么它将无效。您可以手动检查undefined:

var x = v !== undefined ? v : 10;

答案 3 :(得分:1)

我只想使用try-catch

var x = 0;

try
{
    x = v;
}
catch(err)
{
    x = 10;
}

答案 4 :(得分:0)

以下是如何使其正常工作:

var v;         //declare v as undefined
//  v = 5;     //if uncommented x will be 5   

var x = v || 10;
alert(x);      //output: 10

http://jsfiddle.net/uLLtu/1/

答案 5 :(得分:0)

我会在函数中使用三元组等于三元组。

function myTest(x){
 return x === undefined ? true: false;
}    

如果x未定义,则仅返回true

请参阅 (http://www.impressivewebs.com/why-use-triple-equals-javascipt/) 和 (http://jsfiddle.net/V76W6/