以下 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.pluginName
是 null
或 undefined
(或其他 falsy,例如 false
或 0
,但目的通常是检查 undefined
),变量 pluginName
将被设置为指向一个空对象。
这一行依赖于 short circuit 的或运算:如果第一个操作数是 falsy 值(false,或 null
或 undefined
),表达式的结果将是第二个操作数:{}
,它是一个空对象。
想法是将变量初始化为某个(可能为空)对象。
在 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、''。
我目前正在学习开发 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
将被设置为指向一个空对象。
这一行依赖于 short circuit 的或运算:如果第一个操作数是 falsy 值(false,或 null
或 undefined
),表达式的结果将是第二个操作数:{}
,它是一个空对象。
想法是将变量初始化为某个(可能为空)对象。
在 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、''。