var Obj = Obj || {};
这是做什么的?我有成功的写作
array = array || [];
要实例化一个数组,如果还没有被实例化,但是我想了解一下这个机制.
解决方法
短路评估的理论是OR语句仅被评估为第一个真实值.因此,如果上半部分为真,则OR语句的下半部分不被评估.这适用于Javascript ……
但是,JavaScript的特殊性,特别是如何处理未声明的变量,这使得这种技术必须非常小心地用于实例化对象.
以下代码创建一个空对象,除非Obj先前在同一范围内声明:
var Obj = Obj || {}; // Obj will now be {},unless Obj was prevIoUsly defined // in this scope function.... that's not very useful...
这是因为在var Obj之后,Obj将不被定义,除非它被声明在相同的范围内(包括被声明为函数的参数,如果有的话)….所以{}将被评估. (Link to an explanation of var在T.J.Kerder的评论中提供).
以下代码只有在Obj先前被声明并且现在是伪造的情况下才会创建一个空对象:
Obj = Obj || {}; // Better make sure Obj has been prevIoUsly declared.
如果在以前没有声明Obj的情况下使用上述行,则会出现运行时错误,脚本将停止!
例如,这个Javascript不会评估:
(function() { Obj = Obj || "no Obj"; // error since Obj is undeclared JS cannot read from alert(Obj); // an undeclared variable. (declared variables CAN })(); // be undefined.... for example "var Obj;" creates // a declared but undefined variable. JS CAN try // and read a declared but undefined variable)
但是,这个Javascript将始终将Obj设置为“无Obj”!
var Obj ="I'm here!"; (function() { var Obj = Obj || "no Obj"; // Obj becomes undefined after "var Obj"... alert(Obj); // Output: "no Obj" })();
所以在Javascript中使用这种类型的短路评估是危险的,因为你通常只能使用它的形式
Obj = Obj || {};
当您最希望它工作时,哪个会精确地失败…在Obj未声明的情况下.
注意:我在倒数第二个例子的注释中提到了这一点,但是了解这个变量在Javascript中是未定义的2个原因很重要.
>变量可以是未定义的,因为它从未被声明.
>变量可以是未定义的,因为它已被声明但没有赋值给它.
可以使用var关键字声明变量.将值分配给未声明的变量将创建变量.
尝试使用未声明的未定义变量导致运行时错误.使用已经声明的未定义变量是完全合法的.这个区别是使用Obj = Obj || {};这么棘手,因为如果Obj是未声明的或者它是以前存在的变量,那么前面的语句没有意义的形式.