为了账号安全,请及时绑定邮箱和手机立即绑定

typeof!==“undefined”vs.!= null

typeof!==“undefined”vs.!= null

呼啦一阵风 2019-09-18 10:46:05
我经常看到JavaScript代码检查未定义的参数等,这样:if (typeof input !== "undefined") {    // do stuff}这似乎有点浪费,因为它涉及类型查找和字符串比较,更不用说它的冗长。这是必要的,因为'undefined'可以重命名。我的问题是:代码如何比这种方法更好:if (null != input) {    // do stuff}据我所知,你不能重新定义null,所以它不会意外地破坏。并且,由于!=运算符的类型强制,这将检查undefined和null ...这通常正是您想要的(例如,对于可选的函数参数)。然而,这种形式似乎并不普遍,它甚至会导致JSLint对你使用邪恶!=运算符大喊大叫。为什么这被认为是不好的风格?
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

typeof 更安全,因为它允许标识符永远不会被声明:


if(typeof neverDeclared === "undefined") // no errors


if(neverDeclared === null) // throws ReferenceError: neverDeclared is not defined


查看完整回答
反对 回复 2019-09-18
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

如果声明变量(使用var关键字,作为函数参数或作为全局变量),我认为最好的方法是:


if (my_variable === undefined)

jQuery做到了,所以它对我来说足够好了:-)


否则,你将不得不使用typeof以避免ReferenceError。


如果您希望重新定义undefined,可以像这样包装代码:


(function(undefined){

    // undefined is now what it's supposed to be

})();


查看完整回答
反对 回复 2019-09-18
?
喵喔喔

TA贡献1735条经验 获得超5个赞

您不应该真的担心未定义的重命名。如果某人重命名未定义,那么如果检查失败,您将遇到的问题远不止一些。如果你真的想要保护你的代码,请将它包装在IFFE(立即调用的函数表达式)中,如下所示:


(function($, Backbone, _, undefined) {

    //undefined is undefined here.

})(jQuery, Backbone, _);

如果您正在使用浏览器环境中的全局变量(这已经是错误的),我会检查未定义如下:


if(window.neverDefined === undefined) {

    //Code works

}

由于全局变量是窗口对象的一部分,因此您只需检查undefined而不是转换为字符串并比较字符串。


最重要的是,为什么你的变量没有定义?我看过很多代码,他们检查变量是否存在,并根据它执行一些操作。我没有看到这种方法在哪里是正确的。


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 411 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信