使用typeof vs ===检查未声明的变量会产生不同的结果

时间:2015-07-28 09:07:02

标签: javascript operators

如果我有一个未声明的变量并使用typeof,它会告诉我undefined。 但是,如果我使用if (qweasdasd === undefined)检查它,则会抛出异常。

我不理解这种行为,因为如果第一次告诉undefined,那么第二次检查应该评估为if (undefined === undefined),为什么它会引发ReferenceError异常?

6 个答案:

答案 0 :(得分:7)

typeof看起来像一个函数调用,但它不是 - 它是一个运算符。允许运营商违反规则。 typeof(qweasdasd)不认为qweasdasd存在;它是否存在以及它的含义是typeof存在的发现。但是,当您测试qweasdasd === undefined时,您使用qweasdasd作为值,当您使用尚未为其分配值的变量时,JS会抱怨。

答案 1 :(得分:1)

尝试读取未声明变量的值(在将该值与undefined的值进行比较之前必须执行此操作)会引发ReferenceError。

typeof运算符应用于未声明的变量不会。

答案 2 :(得分:1)

我想我对此有一个非常简单的解释 - 因为规格如此说明:

    如果未定义变量,则
  • typeof operator不应抛出ReferenceError异常
  
      
  1. 如果Type( val )是Reference,那么
      一个。如果IsUnresolvableReference( val true ,请返回"undefined"
  2.   
    如果操作数引用未定义的变量,
  • === operator应抛出ReferenceError异常
  
      
  1. lval 为GetValue( lref )。
  2.         

    [在GetValue的定义中我们有]

         
        
    1. base 成为调用GetBase( V )的结果。
    2.   
    3. 如果IsUnresolvableReference( V ),则抛出 ReferenceError 异常。
    4.   

答案 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中访问未定义的变量会产生ReferenceErrortypeof正在运行,因为它无法访问变量值。它检查它的类型。

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