`var options = options ||之间的区别{}`和`选项|| (options = {})`

时间:2012-11-19 12:10:40

标签: javascript

我经常使用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 = {});

}

7 个答案:

答案 0 :(得分:5)

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

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

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

大多数情况下,我认为(a)更加清晰,我不喜欢LHS没有任命的声明。

答案 1 :(得分:4)

没有功能差异。

第二个构造只是(主观地)看起来就像它比第一个构造做的更多。

反驳论点是第一个构造是一个共同的模式,因此更容易识别来做它所做的事情。

答案 2 :(得分:3)

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

理论上第二个,仅在值为假的情况下进行分配,可以消除分配并加快速度。事实上,在jsperf中,我们看到它是(12%)。

实际上,显式if语句与condition-then-assign一样快:

if(!options)
    options = {};

Try the test on your browser/machine

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

编辑:

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

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

这将确保您之后有一个对象,即使它是空的。任何其他测试(对于未定义或虚假)将允许真正的非对象通过非零数字或非空字符串。然而,正如jsperf所示,这慢了约15%。由于你只是在进入一个处理对象的函数时这样做,我认为这是一个值得的权衡,并且总是分配的速度慢得多。

答案 3 :(得分:2)

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

如果保证选项存在(例如,在参数包含options = options || {}的函数中),则这两个语句在功能上是相同的,因此问题会降低到options || (options = {})与{{||的相对风格优点1}}。我个人认为差别不大:两者都需要知道JavaScript的options = options || {}运算符的工作原理,所以一旦从等式中删除了这个因子,我可能会赞成{{1}}因为存在而略微可读。更短更简单。在任何一种情况下,开发人员的意图似乎都同样清楚。

答案 4 :(得分:1)

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

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

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

我个人认为第二种形式是

的可读性较低的版本
if(!options) {
    options = {};
}

函数中都是相同的。

答案 5 :(得分:1)

没有功能差异,我的想法是options || (options = {});更接近程序员真正想要表达的内容,实际上是:

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

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

答案 6 :(得分:0)

绝对主观,但我不会使用第二种。

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

有些C程序员(我曾经,曾经),他们做的事情就像额外的parens一样,让任务更加清晰......让整个表达看起来很陌生。如果你能直截了当,为什么还要费心呢?

最明确的可能是:

if (!options) options = {};