如果链上的某些东西不存在,为什么NOT type undefined会失败?

时间:2018-02-20 16:02:25

标签: javascript undefined typeof

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

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

{{1}}

我可以为VERSION {N}添加一个额外的字母,它仍然会优雅地失败

BUT 如果我向Constructor {r}添加一个额外的字母,它将失败并且未定义“VERSION” 如果我在实际的函数名称下拉列表中添加一个额外的字母{n},则“未定义”“Contructor”。

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

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

但我的问题不是“如何做”。相反,它是“为什么会这样?” ::

如果未定义dropdown.constructor.VERSION,那么可以通过相同的检查来定义dropdownN.constructor.VERSION。

然而,似乎完全缺少该函数($ .fn.dropdown),整个部分将因未定义而失败

为什么使用这两种方式都不安全?看来typeof仅限于最终对象,而不是整个对象链?

2 个答案:

答案 0 :(得分:0)

这可以回答你的问题:

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

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

答案 1 :(得分:0)

typeof运算符无法防止无效使用值。尝试访问undefined上的属性总是会引发错误。 E.g:

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

undefined上的任何内容进行访问均属错误,typeof无法防范,+运算符也无法防范它。