Свойства Javascript инициализированы неправильно - PullRequest
0 голосов
/ 06 июня 2011

Эта проблема сводит меня с ума, потому что этого просто не должно быть.Я прошел через это два десятка раз и не могу понять, почему свойства автоматически сбрасываются.

Вот код

  function BoundingBox(){
        this.intersectBounds = {sx : NaN , sy : NaN , sw : NaN , sh : NaN , dx : NaN , dy : NaN , dw : NaN , dh : NaN , intersects : false};
        console.log(this.intersectBounds);
  }

  for (var i = 0; i<100 ; i++){
    var box = new BoundingBox();

intersectBounds НЕ существует

затем устанавливается на {sx : NaN , sy : NaN...}, а затем, когда я делаю

console.log(this.intersectBounds), первые два прогона результаты будут такими, как и следовало ожидать:

Object
dh: NaN
dw: NaN
dx: NaN
dy: NaN
intersects: false
sh: NaN
sw: NaN
sx: NaN
sy: NaN
__proto__: Object

впоследствии значенияцелые числа, а не NaN.Если это имеет какое-либо применение, значения в одном случае

Object
dh: 42
dw: 470
dx: 0
dy: 0
intersects: true
sh: 42
sw: 470
sx: 0
sy: 0
__proto__: Object

Я не понимаю, как это могло бы быть.this.intersectBounds перезаписывается каждый раз.Это ошибка области?то есть {} добавляет свойства к this.Это ошибка NaN?то есть.NaN ведет себя иначе, чем другие примитивы / объекты?

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Я не совсем уверен, что вы спрашиваете, но я сделаю удар:

Когда вы используете if или любое другое условие, убедитесь, что ваше выражение ... выражение.Вы должны быть в состоянии выразить свое условие на языке плана.Итак, попробуйте произнести это вслух:

if (this.intersectBounds) {
  // do something
}

"Если переменная this.intersectBouds, то что-то сделать."

Если что?Если он не установлен (вероятно, что вы имеете в виду)?Если это не так (вероятно, не то, что вы имеете в виду)?Если это не синий?У вас всегда должно быть какое-то сравнение в вашем условном выражении, поэтому нет никаких сомнений относительно того, какое условие вы проверяете:

if (typeof this.intersectBounds != 'undefined') {
  // do something
}

"Если переменная this.intersectBouds имеет typeof 'undefined',затем сделайте что-нибудь. "

Теперь у нас есть выражение, которое можно выразить простым языком.Это может быть частью того, почему вы попали в ошибку, но даже если это не так, это всегда хорошая практика.

Теперь, что касается области действия ... при первом запускекод this.intersectBounds не будет установлен, если вы не объявили его до выполнения этого кода.В следующий раз, когда вы запустили код, предполагая, что это тот же экземпляр объекта, обрабатывающего его, как в прошлый раз, переменная все равно будет заполнена значением, которое вы установили в прошлый раз (предполагая, что никакой другой код не изменил его).

0 голосов
/ 07 июня 2011

Оказывается, проблема связана с console.log().Казни вниз по течению влияли на заявления печати.Вот примерно то, что выполнялось:

var x = {one : NaN , two : NaN , ... , ehn : NaN};
console.log(x);
...
...
...
x[one]=1; 
x[two]=2;
...
x[ehn]=n;

и консоль, по крайней мере в Google Chrome, будет отображать обновленные значения от 1 до n вместо NaN.

Я нахожу это чрезвычайнораздражает, так как я просто потратил два часа на отладку абсолютно ничего.Один шаг вперед, два шага назад ...

0 голосов
/ 07 июня 2011

после этого значения являются целыми числами, не NaN. Если это имеет какое-либо применение, значения в одном случае

После чего? Вы не показываете код, через который он проходит, поэтому у нас нет возможности выяснить, что это меняет.

И да, NaN ведет себя совершенно иначе, чем другие объекты. NaN не равно ничему, включая сам NaN. NaN == NaN всегда возвращает false! Если вы используете это в сравнениях, это, вероятно, является причиной вашей ошибки.

В подобных случаях, когда у вас есть свойство, которое определено, но не имеет определенного значения, вы должны использовать null вместо NaN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...