Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript对象实例化_Javascript - Fatal编程技术网

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