似乎是错误消息的解决方案
TypeError: Cannot read property XXX of undefined
使用
之类的东西if (item.property) {....}
不再有效。事实上,似乎甚至不再可能获得错误消息,因为现在你得到了
ReferenceError: item is not defined
我之前发现这是因为I had posted an accepted and 13 times upvoted answer to just such a question。对于相同类型的问题,我并不是唯一一个给出代码的人,here is another one - 相同的代码。但是这些解决方案现在立即导致错误!
我DID测试我的代码,如果它没有工作,它几乎不会被投票和接受,对于我链接到的其他Q / A也是如此。
发生了什么事?我似乎无法激发错误消息(无法读取未定义的属性XXX),我尝试通过访问未定义或空变量的属性。我是否已经疯了,或者有其他变化?
答案 0 :(得分:2)
不,这没有改变(有一些类似的已经改变,但不是这个;更多下面)。区别在于:如果item
未声明,那么您将收到有关item
的错误消息。如果声明item
但值为undefined
,则会收到有关读取undefined
属性的错误消息。情况一直如此。
你提到了Firefox。 Firefox针对这两种不同情况的错误消息令人困惑地相似。如果变量是未声明的,则表示:
ReferenceError: item is not defined
但是如果变量被声明并且值为undefined
,则表示:
TypeError: item is undefined
注意区别,但极端相似性。我会说Firefox的错误信息在这方面很差。 Chrome更明显不同:
ReferenceError: item is not defined TypeError: Cannot read property 'property' of undefined
但那只是错误信息。尝试读取未声明符号的值的底层问题始终是一个错误。
重新提到您链接到的两个答案:对不起,但对于未声明的案例(以及undefined
案例的权利),他们总是错误,这只是人们不太了解。如果item
可能完全未声明,则无法使用该习惯用法。您可以使用typeof
,但是:
if (typeof item !== "undefined" && item.property)
typeof
对于未声明的符号很好,但读取未声明符号的值是一个错误,就像我们使用JavaScript一样。
Here's a question from 2011 about this。接受的答案是1,016分,讨论typeof
。
以下是两种情况的例子:
// Note that `item` isn't declared anywhere at all
try {
if (item.property) {
snippet.log("true");
}
}
catch (e) {
snippet.log((e.name || "Exception") + ": " + (e.message || String(e)));
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
undefined
:
var item;
try {
if (item.property) {
snippet.log("true");
}
}
catch (e) {
snippet.log((e.name || "Exception") + ": " + (e.message || String(e)));
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
类似的改变是如何将分配给未完全声明的东西:
item = "foo";
在松散模式下,即使赋值在函数内部,也是implicit global variable。但是,在ES5的严格模式中,这是一个错误。
但这与读取未声明变量的值无关,这总是一个错误,只是写。
答案 1 :(得分:-1)
来自OP:
使用
之类的东西if (item.property) {....}
不再有效。事实上,似乎甚至不再可能获得错误消息,因为现在你得到了
这是不正确的。
在这两个相关问题中,OP都提到item
为undefined
,这意味着他们 已声明,这意味着答案if (item && item.property)
将完全按预期工作。
在这方面没有任何改变,所以回答你的问题:
为什么有效的东西不再起作用了。我链接到两个被接受和高度投票的答案,这些答案不起作用(不再有)!
这些答案工作正常。除非你改变问题的参数,这就是你正在做的事情
(你假设item
是未声明的而不是未定义的)
typeof
"undefined"
与实际变量undefined
之间存在差异: