中…的Javascript有时会通过unexisted属性

中…的Javascript有时会通过unexisted属性,javascript,Javascript,有时,当我调用这个对象的方法时,我得到了“Oops”错误,因为“I”指的是未列出的属性。怎么可能呢 m.derp(); m.herp(); // Sometimes throws error 方法: this.movements = new Array(); this.herp = function() { for (var i in this.movements) { if (!(this.movements[i] instanceof Movement)) {

有时,当我调用这个对象的方法时,我得到了“Oops”错误,因为“I”指的是未列出的属性。怎么可能呢

m.derp();
m.herp(); // Sometimes throws error
方法:

this.movements = new Array();
this.herp = function() {
    for (var i in this.movements) {
        if (!(this.movements[i] instanceof Movement)) {
            throw new Error("Oops"); // this.movements[i] is undefined
        }
    }
}
this.derp = function() {
    var newArray = new Array();
    for (var i in this.movements) {
        if (!this.movements[i].isFinished()) {
            newArray.push(this.movements[i]);
        }
    }
    this.movements = newArray;
}

对于数组,不应在中为使用
。它是一个通用枚举器,包含所有可枚举属性,包括通过原型继承的属性

你应该这样做

for (var i = 0; i < this.movements.length; i++) {
for(var i=0;i
中使用for时,将遇到添加到
数组.prototype
对象.prototype
的任何属性


如果您只需要数字索引,那么
for
语句是正确的使用语句……除非在某些狭窄的情况下,正如下面T.J.Crowder所指出的那样。

对于数组,您不应该在
中使用
for。它是一个包含所有可枚举属性的通用枚举器,包括通过原型继承的属性e

你应该这样做

for (var i = 0; i < this.movements.length; i++) {
for(var i=0;i
中使用
for时,将遇到添加到
数组.prototype
对象.prototype
的任何属性


如果您只需要数字索引,那么
for
语句是正确的使用语句……除非在某些狭窄的情况下,正如T.J.Crowder在下面指出的那样。

通常情况下,您不应该使用
for in
for数组-这种结构更适合于对象。使用传统的
for
循环:

for (var i=0, len=this.movements.length; i<len; i++) //do stuff...

for(var i=0,len=this.movements.length;i通常情况下,您不应在数组中使用
for
这种结构更适合在对象上使用。使用传统的
for
循环:

for (var i=0, len=this.movements.length; i<len; i++) //do stuff...

for(var i=0,len=this.movements.length;i您不应该使用for in来迭代数组,因为实际上您正在迭代数组对象的每个属性,以及继承的属性(我不确定是否有)。使用简单循环:

for(var i = 0; i < arr.length; i++){

}
for(变量i=0;i
您不应该使用for in来迭代数组,因为实际上您正在迭代数组对象的每个属性,以及继承的属性(我不确定是否有)。使用简单循环:

for(var i = 0; i < arr.length; i++){

}
for(变量i=0;i
没有移动实例并不意味着它是未定义的-尝试向它发出警报,您将看到…抛出新错误(“Oops”);//Java的新化身lol@elclanrs:事实上不是。通常情况下,使用
[]
;-)
数组可以隐藏。
新数组
还具有
[]的功能
没有(如果您只给它一个参数,它就可以设置
长度
)。这只是稍微有用,而且让人困惑,因为不止一个参数做了完全不同的事情,但它们肯定不是
===
:-)哦,是的,你说得对,忘记了
新数组(n)
。不显示移动实例并不意味着它未定义-尝试警告它,您将看到…抛出新错误(“Oops”);//Java的新化身lol@elclanrs:事实上不是。通常情况下,使用
[]
;-)
数组可以隐藏。
新数组
还具有
[]的功能
没有(如果您只给它一个参数,它就可以设置
长度
)。这只是稍微有用,而且让人困惑,因为不止一个参数做了完全不同的事情,但它们肯定不是
===
:-)哦,是的,你是对的,忘了
新数组(n)
。“如果您只需要数字索引,那么for语句是正确的方法。”不总是这样。在稀疏数组中,最好使用
for..In
使用
hasOwnProperty
If(String(Number(i))==i)
。只是不要期望它总是以任何给定的顺序工作。:-@t.J.Crowder:不一定。如果您仍然需要保证一个有序的序列,您需要为
提供
。编辑:…刚刚看到了您的更新。我想知道,因为首先
这个。移动
指的是数组
{0:obj,1:obj,2:obj}
和调用后的
m.derp()
它指的是新数组
{0:obj,1:obj}
但是在
m.herp()中
index 2仍然存在,并且
for in
返回它。不知道为什么,可能这是一种V8优化或其他什么_o@user1505315:我必须查看您如何/在何处登录,但Chrome的控制台可能很有趣。当显示对象时,它不一定显示登录时对象的状态。将来的修改可能会反映在控制台中。为了获得更好的快照,您可以浅层克隆阵列。
console.log(this.movements.slice())
…或者为了查看是否有原型可枚举属性,请尝试一下……
for(var p in[])console.log(p);
。如果您收到警报,则会有原型扩展。”如果您只需要数字索引,则for语句是正确的方法。“不总是这样。在稀疏数组中,最好使用
for..In
使用
hasOwnProperty
If(String(Number(i))==i)
。只是不要期望它总是以任何给定的顺序工作。:-@t.J.Crowder:不一定。如果您仍然需要保证一个有序的序列,您需要为
提供
。编辑:…刚刚看到了您的更新。我想知道,因为首先
这个。移动
指的是数组
{0:obj,1:obj,2:obj}
和调用后的
m.derp()
它指的是新数组
{0:obj,1:obj}
但是在
m.herp()中
index 2仍然存在,并且
for in
返回它。不知道为什么,可能这是一种V8优化或其他什么_o@user1505315:我必须查看您如何/在何处登录,但Chrome的控制台可能很有趣。当显示对象时,它不一定显示登录时对象的状态。将来的修改可以反映我