以下 javascript 语法是什么意思?

What does the following javascript syntax mean?

我目前正在学习开发 javascript/jquery 插件,我注意到其中许多插件具有以下语法:

var pluginName = window.pluginName || {};

我很难理解这意味着什么,特别是 OR 花括号部分。如果有人能阐明这在代码上下文中的含义,那就太好了。

转换为:

var pluginName;
if (window.pluginName) {
    pluginName = window.pluginName;
} else {
    pluginName = {};
}

查看更多:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

如果 window.pluginNamenullundefined(或其他 falsy,例如 false0 ,但目的通常是检查 undefined),变量 pluginName 将被设置为指向一个空对象。

这一行依赖于 short circuit 的或运算:如果第一个操作数是 falsy 值(false,或 nullundefined),表达式的结果将是第二个操作数:{},它是一个空对象。

想法是将变量初始化为某个(可能为空)对象。

在 javascript 模块模式 中使用了具有空对象的此短路的另一个实例。 Here's 关于模块模式的一个很好的教程,但特别是,请参阅有关 松散增强 的部分。这是该部分的示例模块定义:

var MODULE = (function (my) {
   // add capabilities...

   return my;
}(MODULE || {}));

在该示例中,代码将通过调用立即调用的函数表达式[=39],在全局命名空间中定义一个新模块(具有 properties/functions 集合的对象) =]: 第一次执行定义模块的函数时,会传入一个空对象,向其中添加capabilities(属性,函数)。

这是一种确保将变量初始化为对象的方法,通常这样对象就可以添加数据 and/or 方法。如果框架将方法定义拆分到不同的文件中,则经常使用它,这样就不会依赖于文件加载来设置库。

在这种情况下,'plugin' 将被赋予插件的当前值,或者如果它还不存在则为一个空对象。

对于 ekuusela 在其他答案之一中发布的代码,它被广泛使用 shorthand:

var pluginName;
if (window.pluginName) {
    pluginName = window.pluginName;
} else {
    pluginName = {};
}

但是:我想补充一点,在某些会导致细微错误的用例中,这是一种不好的做法(尽管这个特定示例很好)。原因是 || 之前的第一条语句是虚假的,所以所有虚假的语句都会导致第二条语句被执行,这并不总是你想要的。

举个例子:很多人使用这个结构来测试参数是否被赋予了值,如果没有被赋予默认值。例如:

function repeat(text, nrOfRepeats) {
   text = text || '';
   nrOfRepeats = nrOfRepeats || 1;

   var i = 0, result = '';
   for (i = 0 ; i < nrOfRepeats; i++) {
     result += text;
   }
   return result;
}

当您像这样调用此函数时:repeat('hello', 0),您希望返回一个空字符串,但您会返回 'hello'。这是因为 0 参数是假的, nrOfRepeats = nrOfRepeats || 1 将解析为 1 而不是您提供的 0。

所以当你使用这个构造时要小心。确保 || 之前的第一条语句在您不希望出现时永远不会为假。这些值被认为是假的:0、false、undefined、null、NaN、''。