测试变量存在性的Javascript多重赋值:var obj=obj||{}
Javascript multiple assignment to test variable existance: var obj = obj = obj || {}
在Ady Osmani关于js中的名称空间的博客文章中,他提到了5种常见的做法来测试先前定义的名称空间/对象的存在性,以防止重写。我在这里复制我关心的3个问题:
var myApplication = myApplication || {}; // option 1
...
var myApplication = myApplication = myApplication || {}; // option 3
myApplication || (myApplication = {}); // option 4
据他说,选项3比选项1更好,但我看不出选项2之间的区别。多做一项作业有什么好处?
为什么备选方案4被认为是最佳做法?
任何没有var
声明的选项都会在"严格"模式下导致异常(或者,正如注释中所指出的,如果您不是处于"严格"状态!)。因此,正如所写的那样,选项4不是一个选项。
备选方案3与备选方案1没有任何不同。选项1实际上与相同
var whatever;
whatever = whatever || {};
选项3有效:
var whatever;
whatever = whatever || {};
whatever = whatever;
var
声明(而不是初始化赋值)在所有情况下都被视为出现在作用域的开头(在本文中,是脚本单元)。如果符号已经声明(已经是window
的属性),则var
声明无效。
因此,var
声明至关重要。因为它被提升到了代码的顶部,所以初始化表达式在"whatever"是而不是已经定义的情况下不会导致"ReferenceError"。因为var
以非破坏性的方式处理声明,所以可以引用=
运算符右侧的符号。
如果变量已经赋值,则选项4不执行任何赋值。如果变量已经赋值,其他选项会将其赋值给自己,因此在这种情况下,它们会进行不必要的赋值。
我看不出选项3怎么比选项1更好。
选项4只是的快捷方式
if (!myApplication)
myApplication = {};
我认为它是最好的,因为它不会做任何不必要的任务
事实上,选项3在我看来有点傻。
当我说我会认为它是最好的(阅读:最可读)解决方案时,我想到了这样的东西:
function foo(bar) {
bar || (bar = {});
}
尽管我可能会走另一条路:
function foo(bar) {
((typeof bar) === 'object') || (bar = {});
}
相关文章:
- 控制台返回var不是't定义,但它是
- 从var向代码隐藏函数传递值
- 如何通过引用var Using DataTables来进行分页或排序
- jQuery语法添加了var
- 如何将具有文本类型值的var放入jQuery函数中
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- 当var==0时,我如何显示一个警报
- javascript中对象构造函数中的var属性与this.properties
- 函数中this和var之间的区别
- JavaScript-的含义:var DndUpload=函数(inputElem){};
- Three.JS OBJ模型未显示
- 测试变量存在性的Javascript多重赋值:var obj=obj||{}
- 这在javascript中是什么意思:var obj = (function(){ .. })().
- 这是什么意思 JavaScript 或 nodeJS - var obj = { is_present: true, s
- 在javascript中,哪个更好' var Obj = Obj ||{} '或' if (Obj === 'u
- Javascript "var obj = new Object"在c#中等价
- 何时使用this.var和var=;在javascript函数obj中
- 如何实现继承像&;var obj = new OpenLayers.Layer.WMS(.. ..)&;在Javascr
- 错误& # 39;美元.类型不是函数var obj = $.类型(pref);'在jqGrid中提交表单时