为什么这些行会产生不同的结果?
if (EventSource !== undefined) { // error
if (typeof(EventSource) !== 'undefined') { // no error
答案 0 :(得分:2)
因为未声明EventSource
,并且它被视为ReferenceError以请求未声明变量的值。
另一方面,typeof
运算符能够将标识符作为操作数而不获取其值,从而避免错误。
如果这是一个局部变量,你应该注意ReferenceError,并先定义它。
如果这是全局的,并且无法事先知道 ,则可以将其作为window
的属性进行检查:
if ("EventSource" in window) {
或
if (window.EventSource !== undefined) {
答案 1 :(得分:1)
您看到的错误, ReferenceError:未定义EventSource 表示JS引擎不知道谁是EventSource
。以前从来没有听过它,它应该读一些东西,但它不知道是什么。 typeof
运算符受到保护而不受该错误的影响,并返回'undefined'
而不是抛出错误,就像它对尚未初始化的变量一样。
答案 2 :(得分:0)
声明没有值的变量是undefined
。
未尝试的变量在您尝试使用时会引发错误,但在使用typeof
时,您可以避免这种情况,因为检查未声明的变量会返回类型'undefined'
。
这样做是因为typeof
是一个总是返回一个字符串的运算符(不是函数),即使你传递了一个之前没有声明的东西。
答案 3 :(得分:0)
来自ECMA-262标准草案:
8.7.1 GetValue(V):[...]如果是IsUnresolvableReference(V),则抛出 ReferenceError 异常。 [...]
11.4.3运算符类型:[...]如果Type(val)为Reference,则[...]如果IsUnresolvableReference(val)为true,则返回“undefined”。 [...]
简而言之,它们是遵循不同规则的不同操作。