我经常看到JavaScript代码检查未定义的参数等,这样:
if (typeof input !== "undefined") {
// do stuff
}
这似乎有点浪费,因为它涉及类型查找和字符串比较,更不用说它的详细程度 . 这是必要的,因为'undefined'可以重命名 . 我的问题是:代码如何比这种方法更好:
if (null != input) {
// do stuff
}
据我所知,你不能重新定义null,所以它不会意外地破坏 . 并且,由于!=运算符的类型强制,这将检查undefined和null ...这通常正是您想要的(例如,对于可选的函数参数) . 然而,这种形式似乎并不普遍,它甚至会导致JSLint对你使用邪恶!=运算符大喊大叫 . 为什么这被认为是不好的风格?
11 回答
您还可以使用void运算符来获取未定义的值:
(是的,如另一个答案中所述,如果未声明变量,这将引发错误,但这种情况通常可以通过代码检查或代码重构来排除,例如使用
window.input !== void 0
来测试全局变量或添加var input
. )我实际上遇到过
(typeof input !== 'undefined')
,在这个场景中,它被用来提供默认的函数参数:ES6以这种方式提供了引入默认函数参数的新方法:
这比第一个选项更简洁,更清晰 .
typeof
允许以前从未声明过标识符 . 所以在这方面更安全:如果声明变量(使用
var
关键字,作为函数参数或作为全局变量),我认为最好的方法是:jQuery做到了,所以它对我来说足够好了:-)
否则,您将不得不使用
typeof
来避免ReferenceError
.如果您希望重新定义undefined,可以像这样包装代码:
好办法:
但最好的方法是检查通过:
您不应该真的担心未定义的重命名 . 如果某人重命名未定义,那么如果检查失败,您将遇到的问题远不止一些 . 如果你真的想保护你的代码,请将它包装在IFFE(立即调用的函数表达式)中,如下所示:
如果您正在使用浏览器环境中的全局变量(这已经是错误的),我会检查未定义如下:
由于全局变量是窗口对象的一部分,因此您可以简单地检查未定义而不是转换为字符串并比较字符串 .
最重要的是,为什么你的变量没有定义?我看过很多代码,他们检查变量是否存在并根据它执行一些操作 . 我没有看到这种方法在哪里是正确的 .
如果你真的担心未定义被重新定义,你可以使用这样的一些帮助方法来防止这种情况:
这是有效的,因为当有人写
undefined = "foo"
时,他只允许 nameundefined
引用新值,但他不会更改undefined
的实际值 .工作得很好 . 它当然不是
null
比较,但我通常发现,如果我需要区分undefined
和null
,我实际上需要区分undefined
和任何虚假值,所以可以 .
如果一个程序重新定义
undefined
,无论如何它真的是脑死亡 .我能想到的唯一原因是IE4兼容性,它不理解
undefined
关键字(不幸的是它实际上不是关键字),但当然值可能是undefined
,所以你必须这样:而上面的比较会很好 .
在你的第二个例子中,你可能需要双括号才能使lint满意吗?