JavaScript对象实例化
有时我会看到这样的代码:JavaScript对象实例化,javascript,Javascript,有时我会看到这样的代码: var Obj = Obj || {}; function foo(param) { param = param || {}; } 这有什么用?我的写作很成功 array = array || []; 如果一个数组还没有被实例化,那么就实例化它,不过我想知道更多关于这个机制的知识。这项技术试图利用一种叫做的东西。。。但在Javascript中这是很棘手的,如果您试图将其用于对象实例化,结果会非常危险 短路评估背后的理论是,OR语句只评估到第一个true值。
var Obj = Obj || {};
function foo(param) {
param = param || {};
}
这有什么用?我的写作很成功
array = array || [];
如果一个数组还没有被实例化,那么就实例化它,不过我想知道更多关于这个机制的知识。这项技术试图利用一种叫做的东西。。。但在Javascript中这是很棘手的,如果您试图将其用于对象实例化,结果会非常危险 短路评估背后的理论是,OR语句只评估到第一个
true
值。因此,如果OR语句的前半部分为true,则不会对其后半部分求值。这适用于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在评论中提供)
以下代码仅在Obj
以前声明过并且现在为falsy时创建空对象:
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”
因此,在Javascript中使用这种类型的短路评估是危险的,因为您通常只能在表单中使用它
Obj = Obj || {};
当您最希望它工作时,它会失败。。。在Obj未声明的情况下
注意:我在倒数第二个示例的注释中提到了这一点,但重要的是要理解Javascript中变量可能未定义的两个原因
var
关键字声明变量。将值赋给未声明的变量将创建该变量
尝试使用未声明的未定义变量会导致运行时错误。使用已声明的未定义变量是完全合法的。这种差异就是使用Obj=Obj | |{}
非常棘手,因为如果Obj
不是未声明的,就是先前存在的变量,那么前面的语句就没有任何有意义的形式
var Obj = Obj || {};
我认为这里的var
是没有必要的。应该是:
Obj = Obj || {};
其中,Obj
在别处定义。如果空对象为null或保留为not,则只需将Obj
分配给空对象。您还可以保留var
关键字,在这种情况下,它将确保声明该对象,即使它不在该语句之前
数组也一样:如果为null,它将把它分配给一个空数组。机制有点不寻常:与大多数语言不同,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
提供真实的信息,请使用对象。”理解此语法的关键是JavaScript中布尔或(或和)表达式的结果是最后计算的组件。正如其他评论者所指出的,JavaScript的短路功能与此功能一起用于有条件地设置array
或Obj
的值
Obj = Obj || {};
这意味着Obj被设置为表达式
Obj |{}
的值。如果Obj为“true”,意味着它的计算结果为true(对于对象,这意味着它存在),则表达式的结果为Obj
,因为表达式短路。但是,如果Obj
为“false”(不存在),则必须计算表达式的第二部分。因此,在这种情况下,表达式的值是{}
,类似于c#?
运算符,但javascript不定义新的运算符。“如果Obj已经存在,则在正常情况下,上述评估将在var Obj=Obj”错误时停止。有一个var-Obj
的事实意味着当该行的Obj |{}
部分求值时(这发生在var-Obj
部分被处理之后),Obj
将是未定义的,因此在包含范围内是否有Obj
并不重要。只有在同一范围(函数)中先前存在另一个var Obj
时,该语句才是正确的,这是非常不寻常的。@T.J.Crowder-正是在这些不寻常的时候,这才是有用的。最常见的用法是,如果未将Obj
参数传递到函数中,则设置一个默认值-看看这两个jsfiddle:-----@Peter:fiddle中的var
没有任何用途,并且掩盖了真正发生的事情。你还在修改论点。(不想把这个交给jsbin vs.fiddle!;-)@Peter:“在var Obj之后,Obj变得未定义。”大多数情况下,是的,如果它在包含范围内声明一个新符号或隐藏一个符号。如果它正在声明变量或参数(如在小提琴中),则var