[英]JavaScript Object instantiation
有时我会看到这样的代码:
var Obj = Obj || {};
这是做什么的? 我写得很成功
array = array || [];
要实例化一个尚未实例化的数组,不过我想了解更多关于它的机制。
该技术试图利用一种称为短路评估的东西......但它在Javascript中很棘手,如果你试图利用它进行对象实例化,结果会非常危险。
短路评估背后的理论是,OR语句仅评估第一个true
值。 因此,如果前半部分为真,则不评估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
将是未定义的,除非它在同一范围内声明( 包括被声明为函数的参数,如果有的话)....所以{}
将被评估。 ( 链接到 TJ Crowder评论中提供的var的解释 )。
以下代码仅在先前已声明 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
设置为“no 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中未定义变量的两个原因。
可以使用var
关键字声明变量。 为未声明的变量赋值会创建变量。
尝试使用未声明的未定义变量会导致运行时错误 。 使用已声明的未定义变量是完全合法的。 这种差异是使用Obj = Obj || {};
Obj = Obj || {};
这很棘手,因为如果Obj
未声明或者它是先前存在的变量,则前一个语句没有任何有意义的形式。
机制有点不寻常:与大多数语言不同,JavaScript是||
运营商不返回true
或false
。 相反,它返回第一个“truthy”值或右手值。 例如:
alert("a" || "b"); // alerts "a", because non-blank strings are "truthy"
alert(undefined || "b") // alerts "b", because undefined is falsey
alert(undefined || false || 0); // alerts "0", because while all are falsy, 0 is rightmost
更多在这篇博文中 。
正如达林所说 ,你的var Obj = Obj || {};
var Obj = Obj || {};
可能不是字面引用,更可能是这样的:
function foo(param) {
param = param || {};
}
......这意味着,“如果来电者没有给我一些真实的param
,那就使用一个物体。”
var Obj = Obj || {};
我认为这里的var
不是必需的。 它应该是:
Obj = Obj || {};
Obj
在别处定义的地方。 这将简单地将Obj
分配给空对象(如果它为null)或保持原样。 您也可以保留var
关键字,在这种情况下,即使它不在此语句之前,它也将确保声明该对象。
对于数组也是如此:如果为null,则将其分配给空数组。
理解这种语法的关键是,JavaScript中的布尔或(或和)表达式的结果是最后评估的组件。 正如其他评论者所指出的,JavaScript的短路与此功能一起用于有条件地设置array
或Obj
的值。
Obj = Obj || {};
这意味着Obj被设置为表达式Obj || {}
的值 Obj || {}
。 如果Obj是“true”,意味着它的计算结果为true(对于一个对象,这意味着它存在),表达式的结果是Obj
,因为表达式是短路的。 但是,如果Obj
为“false”(不存在),则必须计算表达式的第二部分。 因此,在这种情况下,表达式的值为{}
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.