6

我经常使用var options = options || {}默认为空对象的方式。它通常用于初始化选项对象,以防它未在函数调用的参数中传递。

问题是我已经在几个地方(博客文章、源代码)阅读过options || (options = {})更好地表达开发人员意图的地方。有人可以详细说明吗?我看不出两者之间的功能差异,所以我必须在这里遗漏一些东西。

- - 编辑

我在几个地方的 Backbone.js 源代码中看到了,例如https://github.com/documentcloud/backbone/blob/0.9.2/backbone.js#L273

我想我也在 jQuery 的源代码中看到了它。并且在蓬勃发展的多个 Js 写作风格指南中。

--- 编辑 2 代码示例:

var func = function(param, options) {
   // How I do it
   var options = options || {};
   // How I should do it in the "same" way
   options = options || {};
   // The "other" way
   options || (options = {});

}
4

7 回答 7

5

没有真正的区别,假设你的意思是:

function fn(options) {
    // type a
    options = options || {};

    // type b
    options || (options = {});
}

主要是偏好问题,我认为(a)更清晰,我不喜欢在 LHS 上没有赋值的语句。

于 2012-11-19T12:15:04.290 回答
4

没有功能上的区别。

第二个结构(主观上)看起来比第一个结构做得更多。

相反的论点是第一个构造是一种常见的模式,因此更容易识别它所做的事情。

于 2012-11-19T12:14:04.827 回答
3

他们应该做同样的事情,但有更好的方法。

从理论上讲,第二个,仅在值是错误的情况下分配,可以消除分配并更快。实际上,在 jsperf 中,我们看到它是 (12%)。

事实上,显式 if 语句与条件然后赋值一样快:

if(!options)
    options = {};

在您的浏览器/机器上尝试测试

我认为明确的 if 是最清楚的,并且没有惩罚。

编辑:

如果您期望将对象传递给函数,那么我认为更好的测试是:

if(typeof options !== 'object') 
    options = {};

这将确保您之后有一个对象,即使它是空的。任何其他测试(对于未定义或虚假)将允许真实的非对象通过非零数字或非空字符串。然而,正如 jsperf 所示,这慢了约 15%。由于您仅在进入将要处理对象的函数时执行此操作,因此我认为这是一个值得的权衡,并且几乎不比 always-assign 慢

于 2012-11-19T12:30:42.750 回答
2

有一个功能差异:一个使用var,另一个不使用。如果options变量有可能在当前作用域中不存在,则最好使用var而不是冒险options隐式泄漏到外部作用域中。

如果 options 保证存在(例如,在参数包括 的函数中options),则这两个语句在功能上是相同的,因此问题归结为options = options || {}vs的相对风格优点options || (options = {})。就我个人而言,我认为差别不大:两者都需要相同的 JavaScript||运算符如何工作的知识,所以一旦你从等式中删除了这个因素,我可能会倾向于options = options || {}因为更短更简单而更具可读性。在这两种情况下,开发人员的意图对我来说似乎同样清楚。

于 2012-11-19T12:42:32.040 回答
1

两者之间确实没有功能差异,即使它们的机制并不相同。

第一种形式将局部变量options设置为等于参数options或如果参数具有虚假值(例如,如果尚未提供)则设置为空对象。

第二种形式计算参数的值options(如果它不是假的),否则计算为空对象分配给该参数的结果。所以与第一种形式的区别在于,如果options为真,则不执行赋值。

我个人认为第二种形式是可读性较差的版本

if(!options) {
    options = {};
}

在功能力学上与之相同。

于 2012-11-19T12:16:36.400 回答
1

没有功能上的区别,想法是options || (options = {});更接近程序员真正想要表达的,其实就是:

if (typeof options == "undefined") {
  options = {};
}

||运算符用于制作更短的代码,而不是更清晰的代码。

于 2012-11-19T12:17:57.553 回答
0

绝对是主观的,但我不会使用第二个。

原因:我觉得表达式中的赋值比顶层更深=混淆。

一些像这样的 C 程序员(我曾经这样做过),他们会做一些额外的括号之类的事情,以使赋值更加清晰......通过让整个表达式看起来不熟悉。如果您可以直截了当,为什么还要麻烦?

最清楚的可能是:

if (!options) options = {};
于 2012-11-19T12:20:44.760 回答