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

如何检查JavaScript中的“未定义”?

如何检查JavaScript中的“未定义”?

智慧大石 2019-06-10 20:30:43
如何检查JavaScript中的“未定义”?什么是测试变量是否在JavaScript中未定义的最合适的方法?我看到了几种可能的方法:if (window.myVariable)或if (typeof(myVariable) != "undefined")或if (myVariable) //This throws an error if undefined. Should this be in Try/Catch?
查看完整描述

3 回答

?
慕工程0101907

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

如果您有兴趣找出一个变量是否已经声明,而不管它的值如何,那么使用in接线员是最安全的路。以这个例子为例。

// global scopevar theFu; // theFu has been declared, but its value is undefinedtypeof theFu; // "undefined"

但这可能不是某些情况下的预期结果,因为变量或属性是声明的,只是没有初始化。使用in操作人员进行更健壮的检查。

"theFu" in window; // true"theFoo" in window; // false

如果您有兴趣知道变量是未声明的还是有此值的undefined,然后使用typeof接线员。

if (typeof myVar !== 'undefined')

这个typeof运算符保证返回字符串。直接比较undefined令人烦恼undefined可以被覆盖。

window.undefined = "omg";"omg" == undefined // true

正如@CMS所指出的,这已经在ECMAScript第5版中进行了修补。undefined是不可写的。

if (window.myVar)还将包括这些虚假的值,因此它不太可靠:

false
0
""
NaN
null
undefined

感谢@CMS指出你的第三个案子-if (myVariable)还可以在两种情况下抛出错误。第一种情况是,当未定义变量时,将引发ReferenceError.

// abc was never declared.if (abc) {
    // ReferenceError: abc is not defined}

另一种情况是,变量已经定义,但是有一个getter函数,它在调用时抛出一个错误。例如,

// or it's a property that can throw an errorObject.defineProperty(window, "myVariable", { 
    get: function() { throw new Error("W00t?"); }, 
    set: undefined });if (myVariable) {
    // Error: W00t?}


查看完整回答
反对 回复 2019-06-10
?
弑天下

TA贡献1818条经验 获得超8个赞

我个人用

myVar === undefined

警告:请注意===用在==而那myVar以前申报(不是定义).


我不喜欢typeof myVar === "undefined"..我认为这是冗长和不必要的。(我可以用更少的代码完成同样的工作。)

现在有些人读到这篇文章时,会痛苦地倒在地上,尖叫着:“等等!哇!undefined可以重新定义!“

凉爽的。我知道这个。然后,Javascript中的大多数变量都可以重新定义。您不应该使用任何可以重新定义的内置标识符吗?

如果你遵循这条规则,那对你有好处:你不是一个伪君子。

问题是,为了在JS中完成大量的实际工作,开发人员需要依赖可重新定义的标识符来实现它们。我没听人说我不应该用setTimeout因为有人可以

window.setTimeout = function () {
    alert("Got you now!");};

说到底,“它可以重新定义”参数不使用RAW。=== undefined是假的。

(如果你仍然害怕undefined重新定义后,为什么要盲目地将未经测试的库代码集成到代码库中?或者更简单:一种衬里工具。)


还有,就像typeof方法,这种技术可以“检测”未声明的变量:

if (window.someVar === undefined) {
    doSomething();}

但这两种技术在抽象上都有漏洞。我劝你不要用这个甚至

if (typeof myVar !== "undefined") {
    doSomething();}

考虑:

var iAmUndefined;

若要捕获该变量是否已声明,您可能需要使用in接线员。(在许多情况下,您可以简单地读取代码O_o)。

if ("myVar" in window) {
    doSomething();}

但是等等!还有更多!如果一些原型链魔法发生了,…?现在连上级in操作员是不够的。(好吧,这部分我已经讲完了,除了说99%的时间,=== undefined(*咳嗽*)typeof)工作得很好。如果你真的关心这个问题,你可以自己读到。)


查看完整回答
反对 回复 2019-06-10
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

使用typeof是我的首选。当变量从未被声明时,它将工作,不像与=====运算符或类型强制使用if. (undefined,不像null,也可以在ECMAScript 3环境中重新定义,这使得比较起来它不可靠,尽管现在几乎所有公共环境都兼容ECMAScript 5或更高版本)。

if (typeof someUndeclaredVariable == "undefined") {
    // Works}if (someUndeclaredVariable === undefined) { 
    // Throws an error}


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

添加回答

举报

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