如果我有一个未声明的变量并使用typeof
,它会告诉我undefined
。
但是,如果我使用if (qweasdasd === undefined)
检查它,则会抛出异常。
我不理解这种行为,因为如果第一次告诉undefined
,那么第二次检查应该评估为if (undefined === undefined)
,为什么它会引发ReferenceError异常?
答案 0 :(得分:7)
typeof
看起来像一个函数调用,但它不是 - 它是一个运算符。允许运营商违反规则。 typeof(qweasdasd)
不认为qweasdasd
存在;它是否存在以及它的含义是typeof
存在的发现。但是,当您测试qweasdasd === undefined
时,您使用qweasdasd
作为值,当您使用尚未为其分配值的变量时,JS会抱怨。
答案 1 :(得分:1)
尝试读取未声明变量的值(在将该值与undefined
的值进行比较之前必须执行此操作)会引发ReferenceError。
将typeof
运算符应用于未声明的变量不会。
答案 2 :(得分:1)
我想我对此有一个非常简单的解释 - 因为规格如此说明:
typeof
operator不应抛出ReferenceError异常
- 如果Type( val )是Reference,那么
醇>
一个。如果IsUnresolvableReference( val ) true ,请返回"undefined"
。
===
operator应抛出ReferenceError异常
- 让 lval 为GetValue( lref )。
醇>[在GetValue的定义中我们有]
- 让 base 成为调用GetBase( V )的结果。
- 如果IsUnresolvableReference( V ),则抛出 ReferenceError 异常。
醇>
答案 3 :(得分:0)
您有一个未定义的变量,但没有未定义的对象值。
console.log(variable) // undefined
console.log(typeof variable) // "undefined"
console.log(variable === undefined) // Reference error
variable = undefined ;
console.log(variable === undefined) // true
答案 4 :(得分:0)
尝试在Javascript中访问未定义的变量会产生ReferenceError
。 typeof
正在运行,因为它无法访问变量值。它检查它的类型。
typeof不需要定义变量。它的参数应该是一个表达式,表示要返回其类型的对象或基元。
答案 5 :(得分:0)
typeof
是一个运算符,它返回一个字符串,指示未评估的操作数的类型。如果未评估的操作数未定义,则无关紧要。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof
>>> if (a !== 'undefined');
Exception: ReferenceError: Can't find variable: a
>>> if (typeof a !== undefined);
undefined
>>> if (typeof a !== void 0);
undefined