用 typeof 真正检查是不是未定义 [重复]

Posted

技术标签:

【中文标题】用 typeof 真正检查是不是未定义 [重复]【英文标题】:Really check if undefined with typeof [duplicate]用 typeof 真正检查是否未定义 [重复] 【发布时间】:2013-06-22 05:49:03 【问题描述】:

什么是更好的解决方案?

if(typeof bla === "undefined" || bla === null)...

或者

if(bla)...

如果我做第二种解决方案,我真的需要检查它是否未定义吗?

谢谢。

【问题讨论】:

答案是“这取决于你到底想做什么”。 “真正检查是否未定义”...您的意思是,还是“未定义或 null”,因为在这些示例中您也在检查 null。 一个没有定义的属性是未定义的。这么一说,就很明显了。 null 是一个对象。它的类型为空。 undefined 不是对象,它的类型是未定义的。那部分不太明显。 ***.com/questions/6429225/… 【参考方案1】:

对于“检查是否未定义”,最好的解决方案通常是第三个:

Demo

function isDef(obj) 
    var undefined;
    return obj === undefined;

这会检查对象是否未定义而不会浪费时间使用typeof,并且此测试不会像您的第二个测试那样使用""nullNaN0 验证为真。

唯一的缺陷是有人可以覆盖全局undefined 对象。在 ES5 严格模式下是不可能的,但你的代码应该避免这种情况。使用本地 var undefined; 定义跟踪 undefined 可以为您做到这一点。

此外,通过使用 isDef 函数,您可以实现更好的、可移植的缩小和更简单的逻辑。

if (isDef(x)) 
    // do something
 else 
    // do something else
;

【讨论】:

var undefined; 行添加了什么? @smerny 在我看来,这条线是无用的保护。由于 undefined 不能在全局范围内重新定义,因此只检查 obj===undefined 会更简单、更智能。【参考方案2】:

这取决于您期望变量包含的内容。

例如,如果它应该包含一个对象,则第二个选项可以正常工作,因为任何对象引用都是真实的。

例如,如果它应该包含一个布尔值,则第二个选项根本不起作用,因为false 会给出与不存在值相同的结果。

【讨论】:

所以可以肯定的是,检查 undefined 和 null 是更好的解决方案吗? @Christian:这取决于您需要确定的内容。没有适用于所有情况的理想方法。例如,null 值在某些情况下可能是完全有效的值。【参考方案3】:

我真的需要检查它是否未定义吗?

不,undefined 和 null 都解析为 false。第二种选择肯定更好。

【讨论】:

以上是关于用 typeof 真正检查是不是未定义 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript,检查嵌套对象属性是不是为空/未定义的优雅方法[重复]

typeof !== "未定义" vs. != null

js 温故而知新 用typeof 来判断一个未定义的变量

检查单选按钮是不是在javascript中被选中/未选中的函数[重复]

如何检查 JavaScript 中的“未定义”? [复制]

如何检查 JavaScript 中的“未定义”? [复制]