有时我会看到这样的代码:
var Obj = Obj || {};
这是做什么的?我已经成功写作了
array = array || [];
要实例化一个数组,如果它还没有被实例化的话,但是我想知道更多关于这个的机制。
最佳答案
该技术试图利用一种叫做 short circuit evaluation 的东西。 ...但它在 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
将是未定义的,除非它在同一范围内被声明(包括被声明为参数到函数,如果有的话)...所以 {}
将被评估。 ( Link to an explanation of var 在 T.J. Crowder 的评论中提供)。
仅当 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 中未定义的 2 个原因。
- 变量可以是未定义的,因为它从未被声明过。
- 一个变量可以是未定义的,因为它被声明但没有被赋值。
可以使用 var
关键字声明变量。为未声明的变量赋值会创建该变量。
尝试使用未声明的 undefined variable 会导致运行时错误。使用已声明的 undefined variable 是完全合法的。这种差异是使用 Obj = Obj || 的原因{};
如此棘手,因为如果 Obj
未声明或者它是一个先前存在的变量,则前面的语句没有任何有意义的形式。
关于JavaScript 对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3755648/