Javascript多重赋值测试变量存在:var obj = obj = obj || {}

时间:2013-12-06 15:16:29

标签: javascript namespaces override variable-assignment

在Ady Osmani关于js中命名空间的blog post中,他提到了5种常见的做法来测试先前定义的namepsace / object的存在以防止覆盖。我在这里复制了我关心的3个问题:

var myApplication = myApplication || {}; // option 1
...
var myApplication = myApplication = myApplication || {}; // option 3
myApplication || (myApplication = {}); // option 4

根据他的说法,选项3优于选项1,但我看不出2之间的区别。再做一次任务的好处是什么?

为什么选项4被认为是最佳做法?

3 个答案:

答案 0 :(得分:1)

没有var声明的任何选项都会在“严格”模式下导致异常(或者,正如评论中指出的那样,如果您在“严格”中 “模式!)。因此,选项4,如书面所示,不是一种选择。

选项3与选项1无任何不同。选项1实际上与

相同
var whatever;
whatever = whatever || {};

选项3实际上是:

var whatever;
whatever = whatever || {};
whatever = whatever;

所有情况下的var声明(初始化赋值)都被视为它出现在作用域的开头(在此上下文中是脚本单元)。如果符号已经声明(已经是window的属性),则var声明无效。

因此,var声明至关重要。因为它被提升到代码的顶部,所以初始化表达式在 not 已经定义的情况下不会导致“ReferenceError”。因为var以非破坏性的方式处理声明,所以可以引用=运算符右侧的符号。

答案 1 :(得分:0)

如果已经分配了变量,则选项4不会进行任何分配。如果已经分配了变量,则其他选项会将变量分配给自身,因此在这种情况下,它们会执行不必​​要的分配。

我看不出选项3如何优于1。

答案 2 :(得分:-1)

选项4只是

的快捷方式
if (!myApplication)
    myApplication = {};

我认为这是最好的,因为它不做任何不必要的任务。

实际上,选项3对我来说有点傻。


在说明我认为它是 best (读取:最易阅读)的解决方案时,我正在考虑这样的事情:

function foo(bar) {
    bar || (bar = {});
}

即使我可能会采取另一种方式:

function foo(bar) {
    ((typeof bar) === 'object') || (bar = {});
}