【问题标题】:Why does NOT typeof undefined fail if something further up the chain doesn't exist?如果不存在更上游的东西,为什么不 typeof undefined 失败?
【发布时间】:2018-07-31 01:24:06
【问题描述】:

如果函数未定义,为什么检查 NOT typeof === 'undefined' 会失败? 然而在特定对象上检查 NOT 'undefined' 是安全的吗?

这是我的示例:(这确实存在于我的代码中)

if (typeof $.fn.dropdownn.Constructor.VERSION !== 'undefined'){
    //do something
}

我可以在 VERSION{N} 中添加一个额外的字母,但它仍然正常失败

但是 如果我向 Constructor{r} 添加一个额外的字母,它会失败并显示“VERSION”未定义 如果我在实际函数名称下拉{n}中添加一个额外的字母,“构造函数”是未定义的。

(我正在测试添加一个额外的字母来合成不存在的。 事实上,它告诉我链中的下一个对象......从带有更改字母的那个对象是未定义的 :: 似乎暗示它确实正在检查链。)

我要检查的是是否正在使用特定的“版本”。 在某些情况下,将使用不同的“版本”。 在其他情况下,这个 $.function.dropdown 将完全丢失。

但我的问题不是“操作方法”。而是“为什么会这样?” ::

如果 dropdown.constructor.VERSION 未定义,那么 dropdownN.constructor.VERSION 未通过同一个检查进行定义是合理的。

然而,如果该函数 ($.fn.dropdown) 完全缺失,那么整个部分将因未定义而失败

为什么 typeof 不能安全地使用任何一种方式?看来 typeof 仅限于最终对象,而不是整个对象链??

【问题讨论】:

  • 请提供一个清晰的示例,说明失败的内容和失败的错误,以及意外没有失败的内容以及您预期失败的原因。
  • 我认为您的 $.fn.dropdown.Constructors 很可能是一个对象,这就是为什么它对您有用并且它不会崩溃,因为它没有尝试访问未定义对象的属性。因此它与函数typeof 完全无关
  • "为什么 typeof 不能安全地使用任何一种方式?" typeof 不会走“树”,它只是在寻找您引用的项目。
  • 这可能完全改变了问题。但我现在已经澄清了我的问题。哪个是“如果“x.x.x.object”链中的某些内容不存在,为什么 typeof !== 'undefined' 会失败?

标签: javascript undefined typeof


【解决方案1】:

这可能会回答你的问题:

“在 ECMAScript 2015 之前,typeof 总是保证为它提供的任何操作数返回一个字符串。但是添加了非提升、块范围letconst,在声明之前对 let 和 const 变量在块中使用 typeof 会抛出 ReferenceError。这与 undeclared 形成对比变量,其 typeof 将返回 'undefined'。块范围的变量从块开始到初始化处理都处于“临时死区”中,在此期间,如果访问,它将引发错误。”

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof

【讨论】:

  • 这与所提出的问题无关。时间死区与属性访问无关。
  • 谢谢,这有助于我更好地理解。但我已经编辑了我的问题......相当多(道歉)。第一次我并不清楚我在问什么。
【解决方案2】:

typeof 运算符不防止对值的无效使用。尝试访问 undefined 上的属性总是会引发错误。例如:

let foo = undefined;
foo.bar;  // error
foo.bar.baz;  // error
+foo.bar;  // error
typeof foo.bar;  // error

undefined 上的任何内容的任何访问都是错误的,typeof 不会像+ 操作符一样防范它。

【讨论】:

    猜你喜欢
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多