Почему простая неопределенная проверка JS вызовет ошибку? - PullRequest
1 голос
/ 27 января 2012

Я перебираю большой объект, где не все внутренние свойства согласованы.Однако, когда я бросаю оператор if(typeof){} вокруг объекта, он все еще вызывает ошибку:

Оператор

if (typeof pendingTripDropoffMarkers[i].trip.id !== "undefined") {// do stuff}

Ошибка

Uncaught TypeError: Cannot read property 'trip' of undefined

Подвох

Тем не менее, объект-сестра, выполняющий ту же функцию с той же областью действия , прекрасно работает.

if (typeof pendingTripPickupMarkers[i].trip.id !== "undefined") {// do stuff}

Если я распечатаю содержимое объекта после его создания, оно выглядит просто отлично.Так какая злая сила имеет здесь руку?Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Вам следует проверить любые объекты, которые могут быть неопределенными.

if (pendingTripDropoffMarkers[i] 
       && pendingTripDropoffMarkers[i].trip
       && pendingTripDropoffMarkers[i].trip.id !== undefined) {

Если вы действительно обеспокоены перезаписью undefined, не делайте взлом typeof. Просто получите новый undefined, используя оператор void.

if (pendingTripDropoffMarkers[i] 
       && pendingTripDropoffMarkers[i].trip
       && pendingTripDropoffMarkers[i].trip.id !== void 0) {

Если вы уверены, что pendingTripDropoffMarkers[i] должно быть определено, то где-то есть другая проблема.

2 голосов
/ 27 января 2012

Это говорит о том, что pendingTripDropoffMarkers[i] не определено, поскольку "не может прочитать свойство trip undefined "

НЕ обязательно верно, что pendingTripDropoffMarkers или pendingTripDropoffMarkers[i] равны нулю. Действительно, оба предложения почти наверняка ложны. По крайней мере, pendingTripDropoffMarkers должно быть определено ранее и не должно быть нулевым, потому что он не жалуется на то, что какой-то объект индексируется из него. Если бы pendingTripDropoffMarkers[i] было нулевым, ошибка была бы что-то вроде "не может прочитать свойство trip null ", not "не может прочитать свойство trip undefined "

Если, с другой стороны, i выходит за пределы диапазона для массива pendingTripDropoffMarkers, pendingTripDropoffMarkers[i] будет неопределенным. Так что я бы поспорил, что это так, если бы он был определен как массив.

Это не значит, что это правда! Вы все еще можете делать странные вещи, как

var myarray = [undefined,2];

в этом случае myarray[0] будет неопределенным, и попытка получить trip из этого приведет к той же ошибке. Но это очень странный случай.

1 голос
/ 27 января 2012

Если pendingTripDropoffMarkers[i] равно нулю, вы получите ошибку. то есть вы не проверяете, существует ли элемент массива, прежде чем проверять вещи в элемент массива ...

Для удобства чтения я обычно делаю что-то вроде следующего:

var currentElement = pendingTripDropoffMarkers[i],
    elementExists  = currentElement != null,
    hasId          = elementExists && currentElement.trip && currentElement.trip.id

if (elementExists && hasId) {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...