5

这类似于 SO 上的许多其他问题,但与我能找到的任何问题都不完全相同。

哪种方法是检查 Javascript 中未定义值的最佳方法,为什么?

第一个例子:

var a;
if (typeof(a) === 'undefined'){...}

第二个例子:

var a;
if (a === undefined){...}

因此,第一个示例是将类型名称与字符串进行比较,第二个示例将变量与未定义对象进行比较,使用相等运算符检查类型和值是否相同。

哪个更好?还是他们俩都一样好?

请注意,我不是在询问 undefined 和 null 或真或假之间的任何区别,只是这两种方法中的哪一种是正确的和/或更好的。

4

3 回答 3

10

如果一个变量不存在,那么当你尝试使用它时,你会得到一个引用错误——即使你将它与undefined. 所以总是使用typeof.

> foo === undefined
ReferenceError: foo is not defined
    at repl:1:2
    at REPLServer.eval (repl.js:80:21)
    at Interface.<anonymous> (repl.js:182:12)
    at Interface.emit (events.js:67:17)
    at Interface._onLine (readline.js:162:10)
    at Interface._line (readline.js:426:8)
    at Interface._ttyWrite (readline.js:603:14)
    at ReadStream.<anonymous> (readline.js:82:12)
    at ReadStream.emit (events.js:88:20)
    at ReadStream._emitKey (tty.js:320:10)
> typeof foo === "undefined"
true

(坏)代码也有可能覆盖undefined,这将导致未定义的值不等于undefined

于 2012-05-28T20:53:57.873 回答
1

可以分配一个值,类型检查将undefined不起作用。除非代码的范围受到保护,例如

(function(undefined){
    var a;
    if (a === undefined) {
})();
// note called without parameter, so undefined is actually an undefined value

这种检查方式不安全,首选第一种

编辑:ECMA 5 似乎不允许为未定义的值分配值,但这仍然取决于浏览器的实现。

于 2012-05-28T20:54:29.280 回答
0

这两种方法都是正确的,但typeof一种不受 值变化的影响undefined。如果您需要更严格的检查,请使用typeof().

在 ECMA 3 标准中,您可以修改 undefined 的值,如下所示:

undefined = "not undefined";

undefined以后相比,这可能会导致丑陋。在 ECMA 5 中,这是不允许的。这意味着大多数现代浏览器不会让您设置 的值undefined,您应该可以安全地使用=== undefined.

此外,如果您甚至不确定您要检查的变量是否已定义,您应该使用typeof,否则您将收到引用错误。

于 2012-05-28T20:59:54.327 回答