繁体   English   中英

JavaScript对象实例化

[英]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 ObjObj将是未定义的,除非它在同一范围内声明( 包括被声明为函数的参数,如果有的话)....所以{}将被评估。 链接到 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)

jsFiddle例子

但是这个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例子

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

Obj = Obj || {};

当你最希望它工作的时候,哪个会失败?在Obj未申报的情况下。


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

  1. 变量可以是未定义的,因为它从未声明过。
  2. 变量可以是未定义的,因为它已声明但未分配给它的值。

可以使用var关键字声明变量。 为未声明的变量赋值会创建变量。

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

机制有点不寻常:与大多数语言不同,JavaScript是|| 运营商返回truefalse 相反,它返回第一个“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的短路与此功能一起用于有条件地设置arrayObj的值。

Obj = Obj || {};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM