【问题标题】:Using typeof vs === to check undeclared variable produces different result使用 typeof vs === 检查未声明的变量会产生不同的结果
【发布时间】:2015-07-28 09:07:02
【问题描述】:

如果我有一个未声明的变量并使用typeof,它会告诉我它是undefined。 但是,如果我随后使用if (qweasdasd === undefined) 对其进行检查,则会引发异常。

我不明白这种行为,因为如果第一次告诉undefined,那么第二次检查应该评估为if (undefined === undefined),为什么会抛出 ReferenceError 异常?

【问题讨论】:

  • 无法复制:jsfiddle.net/y1xhw9un
  • @Jamiec — 可以复制:jsfiddle.net/y1xhw9un/1
  • @Quentin - 啊,那是未声明,当它未定义时,它可以工作jsfiddle.net/y1xhw9un/2
  • @Jamiec:在那个 sn-p 中,您秘密地将 y 定义为具有 undefined 的值。 OP 询问的是变量未定义的情况,而不是其值为undefined 的情况。 JavaScript 中不存在“未声明”这个术语;错误消息是“ReferenceError: ... 未定义”。
  • @Amadan - 不,看起来(来自 Quentins 示例)OP 有一个未声明的变量 - 这与未定义完全不同。我认为您的回答是正确的 - typeof 让您在没有平等检查的情况下“逃脱惩罚”。

标签: javascript operators


【解决方案1】:

typeof 看起来像一个函数调用,但它不是——它是一个运算符。允许操作员违反规则。 typeof(qweasdasd) 不假定 qweasdasd 存在;它是否存在以及它是什么是typeof 存在的发现。但是,当您测试qweasdasd === undefined 时,您使用的是qweasdasd 作为值,并且当您使用尚未为其赋值的变量时,JS 会报错。

【讨论】:

  • 但是说qweasdasdundefined 不是骗人的吗?因为在我看来if 检查是完全有效的,应该评估为if (undefined===undefined)
  • JavaScript 在这里有点令人困惑(而且它不是唯一的地方;不要让我开始讨论 sort 的疯狂)。正如我所说,未定义和具有值 undefined 是两件不同的事情,typeof(qweasdasd)typeof(undefined) 都产生相同的结果这一事实加剧了这种不幸的情况。
  • 有时候你不得不放弃理解javascript的逻辑。
  • 为什么typeof 的行为不同于一元+
  • 逻辑?这是一种在 10 天内创建的语言,在浏览器环境中获得了垄断地位,最终冻结了它以防止向后不兼容的修改。我吃惊它的形状和它一样好。
【解决方案2】:

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

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

【讨论】:

  • 为什么typeof 的行为不同于例如一元+(例如+foo -> boom!)?
【解决方案3】:

我想我对此有一个非常简单的解释——因为规范是这样说的:

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

[在 GetValue 的定义中我们有]

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

【讨论】:

    【解决方案4】:

    你有一个未定义的变量,但没有一个未定义的对象值。

    console.log(variable) // undefined
    console.log(typeof variable) // "undefined"
    console.log(variable === undefined) // Reference error
    variable = undefined ; 
    console.log(variable === undefined) // true
    

    【讨论】:

      【解决方案5】:

      尝试在 Javascript 中访问未定义的变量会得到ReferenceErrortypeof 正在工作,因为它没有访问变量值。它检查它的类型。

      typeof 不需要定义变量。它的参数应该是一个表达式,表示要返回其类型的对象或原语。

      【讨论】:

        【解决方案6】:

        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
        

        【讨论】:

        • typeof(parseInt): "function"。但是typeof(typeof)SyntaxErrortypeof 不是函数;如果它一个函数,它会给ReferenceError,就像parseInt(qweasdasd)一样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 2015-10-31
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多