这个问题让我疯狂,因为它不应该发生。我已经过了二十次,我无法找出为什么属性会被自动重置。
这是代码
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
的行为与其他基元/对象的行为不同吗?
答案 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。
我发现这非常烦人,因为我花了两个小时调试一切都没事。向前迈出了一步,又退了两步......