我经常使用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 = {});
}
Run Code Online (Sandbox Code Playgroud)
假设你的意思是:没有什么区别
function fn(options) {
// type a
options = options || {};
// type b
options || (options = {});
}
Run Code Online (Sandbox Code Playgroud)
主要是偏好问题,我认为(a)更加清晰,我不喜欢LHS没有任务的陈述.
他们应该做同样的事情,但有更好的方法。
从理论上讲,第二种方法仅在值为假时才进行赋值,可以消除赋值并且速度更快。事实上,在 jsperf 中我们看到它是(12%)。
事实上,显式 if 语句与条件然后分配一样快:
if(!options)
options = {};
Run Code Online (Sandbox Code Playgroud)
我认为显式的 if 是最清楚的,并且没有惩罚。
编辑:
如果您期望将对象传递给函数,那么我认为更好的测试是:
if(typeof options !== 'object')
options = {};
Run Code Online (Sandbox Code Playgroud)
这将确保您之后拥有一个对象,即使它是空的。任何其他测试(对于未定义或虚假)都将允许真实的非对象通过,例如非零数字或非空字符串。然而,正如 jsperf 所示,速度慢了约 15%。由于您仅在进入将处理对象的函数时才执行此操作,因此我认为这是一个值得权衡的方法,并且几乎不比始终分配慢。
| 归档时间: |
|
| 查看次数: |
3444 次 |
| 最近记录: |