微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript对象实例化

有时我会看到这样的代码
var Obj = Obj || {};

这是做什么的?我有成功的写作

array = array || [];

要实例化一个数组,如果还没有被实例化,但是我想了解一下这个机制.

解决方法

该技术试图利用一些名为 short circuit evaluation的东西,但是它在Javascript中很棘手,如果您尝试使用它来进行对象实例化,那么这样做是相当危险的.

短路评估的理论是OR语句仅被评估为第一个真实值.因此,如果上半部分为真,则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.Kerder的评论中提供).

以下代码只有在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设置为“无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中是未定义的2个原因很重要.

>变量可以是未定义的,因为它从未被声明.
>变量可以是未定义的,因为它已被声明但没有赋值给它.

可以使用var关键字声明变量.将值分配给未声明的变量将创建变量.

尝试使用未声明的未定义变量导致运行时错误.使用已经声明的未定义变量是完全合法的.这个区别是使用Obj = Obj || {};这么棘手,因为如果Obj是未声明的或者它是以前存在的变量,那么前面的语句没有意义的形式.

原文地址:https://www.jb51.cc/js/150162.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐