我最近在做一些阅读,我读过的一篇文章来自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,如果v是undefined.这也是事实,x将是10,如果v有任何 "falsey"值.
javascript中的"falsey"值为:
0nullundefinedNaN"" (空字符串)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我在上面指出的任何虚假值,您将得到相同的结果.
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)
如果v计算结果为假(例如0,null,false),那么它将无法工作.您可以手动检查undefined:
var x = v !== undefined ? v : 10;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31714 次 |
| 最近记录: |