Javascript 我应该使用(typeof(val)==&&x27;未定义&&x27;)还是(val===未定义)?

Javascript 我应该使用(typeof(val)==&&x27;未定义&&x27;)还是(val===未定义)?,javascript,Javascript,这与其他一些问题类似,但与我能找到的任何问题都不完全相同 检查Javascript中未定义值的最佳方法是什么,为什么 第一个例子: var a; if (typeof(a) === 'undefined'){...} 第二个例子: var a; if (a === undefined){...} 因此,第一个示例将类型的名称与字符串进行比较,第二个示例使用相等运算符将变量与未定义的对象进行比较,该运算符检查类型和值是否相同 哪个更好?还是他们俩都一样好 请注意,我并没有询问undefined

这与其他一些问题类似,但与我能找到的任何问题都不完全相同

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

第一个例子:

var a;
if (typeof(a) === 'undefined'){...}
第二个例子:

var a;
if (a === undefined){...}
因此,第一个示例将类型的名称与字符串进行比较,第二个示例使用相等运算符将变量与未定义的对象进行比较,该运算符检查类型和值是否相同

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


请注意,我并没有询问undefined和null、truthy和falsey之间的任何区别,只是问这两种方法中哪一种是正确的和/或更好的。

如果变量不存在,那么当您尝试使用它时,您将得到一个引用错误-即使您将它与未定义的
进行比较。因此,请始终使用
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
>foo===未定义
ReferenceError:未定义foo
回复:1:2
在REPLServer.eval(repl.js:80:21)
在接口处。(回复js:182:12)
在Interface.emit(events.js:67:17)
在接口处在线(readline.js:162:10)
在接口处。\u行(readline.js:426:8)
在接口处写入(readline.js:603:14)
在ReadStream。(readline.js:82:12)
在ReadStream.emit(events.js:88:20)
在ReadStream._emitKey(tty.js:320:10)
>foo的类型==“未定义”
真的

(错误)代码也可能覆盖
未定义
,这将导致未定义值不等于
未定义

未定义的
可以指定一个值,类型检查将不起作用。除非规范的范围受到保护,例如:

(function(undefined){
    var a;
    if (a === undefined) {
})();
// note called without parameter, so undefined is actually an undefined value
这种检查方法不安全,首选第一种


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

这两种方法是正确的,但
类型的
一种方法不受
未定义的
值的更改的影响。如果需要更严格的检查,请使用
typeof()

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

undefined = "not undefined";
与未定义的
相比,这可能会导致丑陋。在ECMA 5中,这是不允许的。这意味着大多数现代浏览器不允许您设置
未定义的值
,使用
===未定义的
应该是安全的


此外,如果您甚至不确定正在检查的变量是否已定义,则应使用
typeof
,否则您将得到一个参考错误。

Afaik它们是相同的,只要您设置了自己的本地
未定义
,或者你可以相信,没有傻瓜会将其重新定义为
true
或其他什么。
typeof
不是一个函数。您不需要参数。第一种方法更安全,因为(A)您不必担心
undefined
变量是否真的包含
undefined
值,以及(B)您不必担心操作数未声明时的引用错误。谢谢@ŠimeVidas,这是一个很好的答案。可惜你没有把它作为一个正确的答案,而是作为一个评论。尽管如此,我还是会看看我是否可以投票支持你。@MickSear我刚刚总结了下面的现有答案
:)
这是确保
未定义的
确实是未定义的一个很好的方法,因为
未定义的
是可定义的。你也可以与
void 0
进行比较,但与未初始化的变量进行比较也可以。哦,
未定义的
确实有一个值,这个值。;-)这个问题包括声明(
var a
),因此在特定场景中不会发生这种情况。总的来说,我承认你是正确的。有很多好的答案和观点,谢谢大家。是的,变量a是故意的。严格相等是不必要的,
=
就足够了。类型转换是不必要的,
==
就足够了。@RobG,Quentin:两个操作符将按照规范执行完全相同的步骤,因此,对一种或另一种的任何偏好纯粹是风格上的。分配给
未定义的
只会在ES5严格模式下抛出。不需要使用
类型为
的分组运算符,它是一个运算符,而不是一个函数。