我经常看到JavaScript代码以这种方式检查未定义的参数等:
if (typeof input !== "undefined") {
// do stuff
}
这似乎有点浪费,因为它涉及类型查找和字符串比较,更不用说它的冗长了。需要它是因为undefined可以重命名。
我的问题是:
这段代码比下面的方法好到哪里去了:
if (null != input) {
// do stuff
}
据我所知,你不能重定义null,所以它不会意外中断。并且,由于!=操作符的类型强制,这将检查undefined和null…这通常正是你想要的(例如,对于可选的函数参数)。
然而,这种形式似乎并不普遍,它甚至会导致JSLint因为您使用了邪恶的!=操作符而对您大喊大叫。
为什么这被认为是糟糕的风格?
if (input == undefined) { ... }
工作得很好。这当然不是一个空的比较,但我通常发现,如果我需要区分undefined和null,我实际上更需要区分undefined和任何假值,所以
else if (input) { ... }
它。
如果一个程序重新定义了undefined,那么无论如何它都是脑死亡。
我能想到的唯一原因是IE4兼容性,它不理解未定义关键字(这实际上不是一个关键字,不幸的是),但当然值可以是未定义的,所以你必须有这个:
var undefined;
上面的比较就可以了。
在你的第二个例子中,你可能需要双括号来让lint开心?
你不应该真的担心undefined被重命名。如果有人重命名为undefined,那么您将遇到比检查失败更多的麻烦。如果你真的想保护你的代码,把它包装在IFFE(立即调用的函数表达式)中,就像这样:
(function($, Backbone, _, undefined) {
//undefined is undefined here.
})(jQuery, Backbone, _);
如果你在浏览器环境中使用全局变量(这已经是错误的),我会像这样检查undefined:
if(window.neverDefined === undefined) {
//Code works
}
由于全局变量是窗口对象的一部分,您可以简单地检查undefined,而不是强制转换为字符串并比较字符串。
最重要的是,为什么变量没有定义?我见过很多代码,它们检查变量是否存在,并基于此执行一些操作。我从未见过这种方法在哪里是正确的。
if (input == undefined) { ... }
工作得很好。这当然不是一个空的比较,但我通常发现,如果我需要区分undefined和null,我实际上更需要区分undefined和任何假值,所以
else if (input) { ... }
它。
如果一个程序重新定义了undefined,那么无论如何它都是脑死亡。
我能想到的唯一原因是IE4兼容性,它不理解未定义关键字(这实际上不是一个关键字,不幸的是),但当然值可以是未定义的,所以你必须有这个:
var undefined;
上面的比较就可以了。
在你的第二个例子中,你可能需要双括号来让lint开心?