3

我在 JavaScript 中看到了以下语法,它允许您向 Objects 元素添加函数,以便您可以执行切换选项。考虑以下:

var insert = insert || {};

 insert.Actor = function (user) {
    //Do Somthing
}

这将允许您执行以下操作:

function addUser(type) {

    if (insert[type]) {
            return insert[type](user);
        }
}

我喜欢这个实现,但我有两个问题:

  1. 这个语句到底在做什么,我可以只声明一个常规对象吗?

    变量插入 = 插入 || {};

  2. 除了可读性之外,使用它而不是常规的 switch 语句还有什么好处。

4

5 回答 5

3

您可以将函数添加到 JavaScript 中的任何对象。你看到的语法只是“说”如果对象已经存在......使用它,否则,创建一个新对象。

var insert = insert || {};

变量insert被设置为自身,||(OR) 被设置{}为新对象的简短语法。

于 2013-08-14T01:35:55.077 回答
1

这个语句到底在做什么,我可以只声明一个常规对象吗?

在 JS 中,foo.bar如果 foo 未定义,则会导致引用错误。 var insert = insert || {};确保这insert将是一个对象,这样检查就像if(insert[type])预期的那样工作(insert[type]将是未定义的)

更一般地说,||是逻辑 OR 运算符,其工作原理如下:http://www.ecma-international.org/ecma-262/5.1/#sec-11.11如果左侧表达式(insert在这种情况下)是“真实值”(包括对象但不包括0or之类undefined的值),则该值为 LHS;否则该值为 RHS 表达式。

除了可读性之外,使用它而不是常规的 switch 语句还有什么好处。

您必须if(insert)在 switch 语句的每个块中都有许多形式的条件。使用这种方法,您可以消除其中的大部分。

于 2013-08-14T01:43:04.163 回答
0
  1. 这实际上取决于您是否有理由相信insert已经在该范围内声明了它,以及它是否与insert您想要的相同。显然,如果insert已在其他地方定义并且没有执行您希望它执行的操作,则此语法没有帮助,因为它将insert在您的范围内设置为insert已在其他地方定义的内容。
  2. 与使用switch声明相比,这是一种风格偏好。这就是它的全部意义。你必须问自己,“谁会阅读这篇文章,什么对他们理解它的作用最有帮助?”
于 2013-08-14T01:46:01.110 回答
0
insert || {};

从左到右返回第一个为真的操作数。

这是一个“或”运算符。在 Javascript 中,“OR”运算符不会简单地返回 true/false 布尔值。这只是一个捷径,如果未定义插入,则将其定义为对象。

于 2013-08-14T01:37:08.337 回答
0
var insert=insert||{};

相当于:

if (!insert) var insert={};

(如果插入对象不存在,则创建它)

第一个表达式只是使代码更短。

这通常在模块化脚本中使用,因为任何模块都可以初始化插入对象,然后其他模块将重用该对象。

于 2013-08-14T01:52:15.857 回答