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比较,但我通常会发现,如果我需要区分undefinednull ,实际上我需要区分undefined和任何false值,所以

 else if (input) { ... } 

可以。

如果一个程序重新定义了undefined那么它确实是braindead。

我能想到的唯一原因是IE4兼容性,它不明白undefined关键字(这实际上不是一个关键字,不幸的是),但当然值可能 undefined ,所以你必须有这样的:

 var undefined; 

和上面的比较将工作得很好。

在第二个例子中,你可能需要双括号才能使皮棉幸福吗?