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是未声明的或者它是以前存在的变量,那么前面的语句没有意义的形式.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...