Javascript属性初始化不正确

时间:2011-06-06 19:47:01

标签: javascript variables initialization

这个问题让我疯狂,因为它不应该发生。我已经过了二十次,我无法找出为什么属性会被自动重置。

这是代码

  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 个答案:

答案 0 :(得分:1)

我不完全确定你在问什么,但我会抓住它:

当您使用if或任何其他条件时,请确保您的表达式是......表达式。您应该能够用计划语言表达您的条件。所以,试着大声说出来:

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

“如果变量this.intersectBouds然后做某事。”

如果是什么?如果没有设置(可能是你的意思)?如果它不是假的(可能不是你的意思)?如果不是蓝色的?您应该总是在条件表达式中进行某种比较,因此毫无疑问您要测试的条件是什么:

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

“如果变量this.intersectBouds的类型为'undefined',那么就做点什么。”

现在我们有了一个能够用简单语言表达的表达式。这可能是你遇到错误的部分原因,但即使不是这样,这也是一种很好的做法。

现在,就范围而言......第一次运行代码时,如果在此代码执行之前未声明代码,则不会设置this.intersectBounds。您运行代码的 next 时间,假设这是与上次处理它的对象相同的实例,该变量仍然会填充您最后设置的值时间(假设没有其他代码改变它)。

答案 1 :(得分:0)

  

之后,值为整数,   不是NaN。如果它有用,那么   一个案例中的值是

什么后呢?你没有向我们展示它运行的代码,所以我们无法弄清楚它改变了什么。

是的,NaN与其他对象的行为非常不同。 NaN不等于任何东西,包括NaN本身。 NaN == NaN总是会返回false!如果您在比较中使用它可能是导致错误的原因。

如果您拥有已定义但未设置为特定值的属性,则应使用null代替NaN

答案 2 :(得分:0)

原来问题与console.log()有关。下游的执行影响了印刷报表。这大致是正在执行的内容:

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

并且控制台(至少在谷歌浏览器中)会显示更新的值1到n,而不是NaN。

我发现这非常烦人,因为我花了两个小时调试一切都没事。向前迈出了一步,又退了两步......