JavaScript 对象实例化

标签 javascript

有时我会看到这样的代码:

var Obj = Obj || {};

这是做什么的?我已经成功写作了

array = array || [];

要实例化一个数组,如果它还没有被实例化的话,但是我想知道更多关于这个的机制。

最佳答案

该技术试图利用一种叫做 short circuit evaluation 的东西。 ...但它在 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 Obj 之后,Obj 将是未定义的,除非它在同一范围内被声明(包括被声明为参数到函数,如果有的话)...所以 {} 将被评估。 ( Link to an explanation of var 在 T.J. Crowder 的评论中提供)。

仅当 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 设置为“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 example

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

Obj = Obj || {};

恰好在您最希望它工作的时候...在未声明 Obj 的情况下会失败。


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

  1. 变量可以是未定义的,因为它从未被声明过。
  2. 一个变量可以是未定义的,因为它被声明但没有被赋值。

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

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

关于JavaScript 对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3755648/

相关文章:

javascript - 从 Javascript 中的字符串中删除特定字符

javascript - 按字母顺序对 tr 元素进行排序

javascript - 将内部 div 文本传递给函数

javascript - 我不明白对象的可写和可配置属性

javascript - 媒体查询导航栏中的 Fa 图标分布

javascript - SharePoint REST _api DateTimeRange 查询

javascript - 如何在 highchart 中传递数组??

javascript - 使用 chrome 调试器有没有办法查看调用我的 api 的函数?

javascript - 建立博客 : what's standard?

javascript - 检测 div 在数组中的位置