中…的Javascript有时会通过unexisted属性
有时,当我调用这个对象的方法时,我得到了“Oops”错误,因为“I”指的是未列出的属性。怎么可能呢中…的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)) {
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的控制台可能很有趣。当显示对象时,它不一定显示登录时对象的状态。将来的修改可以反映我