Hej, jag har en array som när man gör arraynamn.length ger svaret 1 men i en for in-loop ger 2 svar. JavaScripts for(... in ...) loopar inte genom en arrays element utan ett objekts egenskaper/metoder. Tack för det utförliga svaret! Det går, med hasOwnProperty()Märkligt problem med for .. in loop
Fullständiga koden ser ut såhär:Object.prototype.Inherits = function( parent )
{
if( arguments.length > 1 )
{
parent.apply( this, Array.prototype.slice.call( arguments, 1 ) );
}
else
{
parent.call( this );
}
}
Function.prototype.Inherits = function( parent )
{
this.prototype = new parent();
this.prototype.constructor = this;
}
function Shape(posx, posy)
{
this.posx = posx;
this.posy = posy
}
Rectangle.Inherits(Shape);
function Rectangle(posx, posy, width, height)
{
this.Inherits(Shape, posx, posy);
this.width = width;
this.height = height;
}
// Kör koden
var rect = new Rectangle();
var list = new Array();
list.push(rect);
alert('Listans längd: ' + list.length);
for(var index in list)
{
alert('index: ' + index);
}
De 2 första inherits-funktionerna har jag fått härifrån ( http://www.coolpage.com/developer/javascript/Correct%20OOP%20for%20Javascript.html ) och det var när jag försökte få in någon typ av arv i Rectangle-funktionen mha dem som problemen började.
for-loopen returnerar först 0 som den ska, men sedan körs den ännu en gång och returnerar "Inherits"
Jag förstår inte alls varför, skulle någon kunna förklara och berätt ahur jag kommer runt det? :)
Sv: Märkligt problem med for .. in loop
Raden var list = new Array(); skapar ett arrayobjekt. Detta objekt har en egenskap 'Inherits', vilken du skapade med raden Object.prototype.Inherits = function( parent ) { ...}. Du lägger sedan till elementet rect till arrayen. Detta betyder att en ny egenskap med ett numeriskt namn (i detta fall '0') skapas i objektet. Egenskapens värde blir elementet/objektet rect.
När du sedan loopar genom list med for(... in ...) hämtas de två egenskaperna: '0' och 'Inherits'.
Om du testar koden i andra webbläsare, t.ex. Firefox, kan det hända att du få ut fler egenskaper genom loopen, egenskaper som webbläsaren har fördefinierade för objektet.
För att loopa genom en array så som du vill, gör så här:
var l = list.length;
for(var i=0; i<l; i++)
{
alert('index: ' + i + '; value: ' + list[i]);
}
Sv:Märkligt problem med for .. in loop
Det är ju lite synd då att det inte finns någon for each eller mostvarande loop. Att skriva en traditionell for loop är ju lite jobbigt, men visst går det :)Sv: Märkligt problem med for .. in loop
var y = new Array('x','y','z');
var result = '';
for (var x in y)
if(y.hasOwnProperty(x))
result += x + ': ' + y[x] + '\n';
alert(result);
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty