JavaScript对象实例化

时间:2010-09-20 21:27:36

标签: javascript

有时我会看到这样的代码:

var Obj = Obj || {};

这是做什么的?我写了成功

array = array || [];

如果数组尚未实例化,则要实例化它,但是我想了解更多关于它的机制。

4 个答案:

答案 0 :(得分:11)

该技术尝试使用一种名为 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将被取消定义,除非它在同一范围内声明(包括被声明为函数的参数,如果有的话) ....所以{}将被评估。 (T.J.Crowder的评论中提供了 Link to an explanation of 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)

<强> jsFiddle example

但是这个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"
})();​

<强> jsFiddle example

因此在Javascript中使用这种类型的短路评估是危险的,因为您通常只能以表格形式使用它

Obj = Obj || {};

在Obj未申报的情况下,哪些会失败正是你最希望它工作的时候 ......


注意:我在倒数第二个例子的评论中提到了这一点,但重要的是要理解在Javascript中未定义变量的两个原因。

  1. 变量可以是未定义的,因为它从未声明过。
  2. 变量可以是未定义的,因为它已被声明,但尚未分配给它。
  3. 可以使用var关键字声明变量。为未声明的变量赋值会创建变量。

    尝试使用未声明的未定义变量会导致运行时错误。使用已声明的未定义变量是完全合法的。这种差异使得使用Obj = Obj || {};如此棘手,因为如果Obj未声明或者它是先前存在的变量,则前一语句没有任何有意义的形式。

答案 1 :(得分:3)

机制有点不寻常:与大多数语言不同,JavaScript的||运算符返回truefalse。相反,它返回第一个“真实”值右侧值。例如:

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

更多this blog post

作为Darin said,您的var Obj = Obj || {};可能不是字面引用,更可能是这样的:

function foo(param) {
    param = param || {};
}

...这意味着,“如果来电者没有给我param的真相,请使用一个对象。”

答案 2 :(得分:2)

var Obj = Obj || {};

我认为var这里没有必要。它应该是:

Obj = Obj || {};

其他地方Obj的定义。这将简单地将Obj分配给空对象(如果它为空)或保留原样。您也可以保留var关键字,在这种情况下,它将确保声明对象,即使它不在此声明之前。

数组相同:如果为null,则将其分配给空数组。

答案 3 :(得分:0)

理解这种语法的关键是JavaScript中的布尔或(或和)表达式的结果是最后评估的组件。正如其他评论者所指出的,JavaScript的短路与此功能一起用于有条件地设置arrayObj的值。

Obj = Obj || {};

这意味着Obj被设置为表达式Obj || {}的值。如果Obj为“true”,意味着它的计算结果为true(对于一个对象,这意味着它存在),表达式的结果为Obj,因为表达式短路。但是,如果Obj为“false”(不存在),则必须计算表达式的第二部分。因此,在这种情况下,表达式的值为{}