我最近一直在阅读一篇我读过的文章来自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?
- 感谢。 布赖恩
答案 0 :(得分:53)
Opera文章对发生的事情描述不佳。
如果x
10
为v
,则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
如果是函数,则永远不会执行)。
undefined
,null
和0
都是变量可以容纳的虚假值的示例(是的,甚至是第一个),运算符(或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(例如,0
,null
,false
),那么它将无效。您可以手动检查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
答案 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/)