我目前正在学习开发 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.pluginName
是 null
或 undefined
(或其他 falsy,如 false
或 0
,但目的通常是检查 undefined
),则将设置变量 pluginName
指向一个空的对象。
此行依赖于 OR 来实现短路:如果第一个操作数是 falsy 值(false、或
null
或 undefined
),则表达式的结果将是第二个操作数:{}
这是一个空物体。
这个想法是变量将被初始化为某个(可能是空的)对象。
这个带有空对象的短路的另一个实例用于 javascript 模块模式。 这里有一个关于模块模式的很好的教程,但具体请参阅“松散增强”部分。这是该部分的示例模块定义:
var MODULE = (function (my) {
// add capabilities...
return my;
}(MODULE || {}));
立即调用的函数表达式,在全局命名空间中定义一个新模块(具有属性/函数集合的对象):第一次执行定义模块的函数时,它将传递一个空对象,其中将添加
功能(属性,函数)。
这是确保变量初始化为对象的一种方法,通常这样对象就可以添加数据和/或方法。如果框架将方法定义拆分到不同的文件中,则通常会使用它,这样设置库时就不会依赖文件加载的顺序。
这是 ekuusela 在其他答案之一中发布的代码的常用简写:
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、假、未定义、null、NaN、''。