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

Javascript multiple assignment to test variable existance: var obj = obj = obj || {}

本文关键字:obj var 赋值 存在 变量 Javascript 测试      更新时间:2024-04-16

在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 = {});
}