typeof!==“undefined”vs.!= null
我经常看到这样检查未定义参数的JavaScript代码:
if (typeof input !== "undefined") { // do stuff }
这看起来很浪费,因为它涉及到一个types查询和一个string比较,更不用说冗长了。 这是需要的,因为'undefined'可以被重命名。 我的问题是:该代码如何比这种方法更好:
if (null != input) { // do stuff }
据我所知,你不能重新定义null,所以它不会意外中断。 而且,由于!=运算符的types强制,这将检查undefined和null …这通常正是你想要的(例如对于可选的函数参数)。 然而,这种forms似乎并不普遍,甚至导致JSLint使用邪恶的!=运算符来大吼你。 为什么这被认为是不好的风格?
typeof
允许标识符从来没有被声明过。 所以在这方面更安全:
if(typeof neverDeclared == "undefined") //no errors if(neverDeclared == null) //throws ReferenceError: neverDeclared is not defined
如果variables是声明的(无论是关键字var
,作为函数参数,还是作为全局variables),我认为最好的办法是:
if (my_variable === undefined)
jQuery做到了,所以这对我来说已经足够了:-)
否则,你将不得不使用typeof
来避免ReferenceError
。
如果你期望undefined被重新定义,你可以像这样包装你的代码:
(function(undefined){ // undefined is now what it's supposed to be })();
好办法:
if(typeof neverDeclared == "undefined") //no errors
但最好看的方法是通过检查:
if(typeof neverDeclared === typeof undefined) //also no errors and no strings
你不应该担心undefined被重命名。 如果某人重新命名为undefined,那么如果检查失败,你将会遇到很多麻烦。 如果你真的想要保护你的代码,把它包装在一个IFFE(立即调用的函数expression式)中,如下所示:
(function($, Backbone, _, undefined) { //undefined is undefined here. })(jQuery, Backbone, _);
如果你在浏览器环境中使用全局variables(这已经是错误的),我会检查像这样的undefined:
if(window.neverDefined === undefined) { //Code works }
由于全局variables是窗口对象的一部分,您可以简单地检查未定义,而不是转换为string和比较string。
最重要的是,为什么你的variables没有定义? 我看过很多代码,他们检查一个variables的存在,并根据这个进行一些操作。 我从来没有见过这种方法是正确的。
如果你真的担心undefined被重新定义,你可以用这样的辅助方法来防止这个:
function is_undefined(value) { var undefined_check; // instantiate a new variable which gets initialized to the real undefined value return value === undefined_check; }
这是有效的,因为当有人写undefined = "foo"
他只会让名字 undefined
引用一个新的值,但是他不会改变undefined
的实际值。
您也可以使用void运算符来获取未定义的值:
if (input !== void 0) { // do stuff }
(是的,正如另一个答案所指出的,如果variables没有被声明,这将会抛出一个错误,但是这种情况通常可以通过代码检查或代码重构来排除,例如使用window.input !== void 0
用于testing全局variables或添加无var input
。)
if (input == undefined) { ... }
工作得很好。 这当然不是一个null
比较,但我通常会发现,如果我需要区分undefined
和null
,实际上我需要区分undefined
和任何false值,所以
else if (input) { ... }
可以。
如果一个程序重新定义了undefined
那么它确实是braindead。
我能想到的唯一原因是IE4兼容性,它不明白undefined
关键字(这实际上不是一个关键字,不幸的是),但当然值可能是 undefined
,所以你必须有这样的:
var undefined;
和上面的比较将工作得很好。
在第二个例子中,你可能需要双括号才能使皮棉幸福吗?