最近在Javascript实现中有什么变化(或者是我)?

时间:2014-12-10 08:09:51

标签: javascript

似乎是错误消息的解决方案

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),我尝试通过访问未定义或空变量的属性。我是否已经疯了,或者有其他变化?

2 个答案:

答案 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都提到itemundefined,这意味着他们 已声明,这意味着答案if (item && item.property)将完全按预期工作。

在这方面没有任何改变,所以回答你的问题:

为什么有效的东西不再起作用了。我链接到两个被接受和高度投票的答案,这些答案不起作用(不再有)!

这些答案工作正常。除非你改变问题的参数,这就是你正在做的事情 (你假设item是未声明的而不是未定义的)

typeof "undefined"与实际变量undefined之间存在差异:

enter image description here