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