arguments
is said to be ein Array-ähnlichen Objekt. Wie Sie bereits gesehen haben, können Sie auf seine Elemente per Index zugreifen, aber Sie haben nicht alle Array-Methoden zur Verfügung. Andere Beispiele für arrayähnliche Objekte sind HTML-Auflistungen, die von getElementsByTagName() oder getElementsByClassName() zurückgegeben werden. jQuery, wenn Sie es jemals benutzt haben, ist auch ein Array-ähnliches Objekt. Überprüfen Sie nach dem Abfragen einiger DOM-Objekte das resultierende jQuery-Objekt mit Firebug auf der Registerkarte DOM und Sie werden sehen, was ich meine.
Hier ist meine Lösung für das Problem Meebo:
function conc(){
if (arguments.length === 0)
return "";
else
return Array.prototype.slice.call(arguments).join(" ");
}
alert(conc("a", "b", "c"));
Array.prototype.slice.call(arguments)
ein netter Trick ist unser arguments
in ein wahres Array-Objekt zu verwandeln. In Firefox Array.slice.call(arguments)
würde ausreichen, aber es wird nicht funktionieren in IE6 (zumindest), so ist die frühere Version, was normalerweise verwendet wird.Dieser Trick funktioniert auch nicht für die Sammlung, die von DOM-API-Methoden in IE6 (mindestens) zurückgegeben wird; Es wird einen Fehler auslösen. By the way, anstelle von call
könnte man apply
verwenden.
Eine kleine Erklärung über Array-ähnliche Objekte. In JavaScript können Sie so ziemlich alles verwenden, um die Mitglieder eines Objekts zu benennen, und Zahlen sind keine Ausnahme. So ein Objekt konstruieren kann, die so aussieht, die perfekt gültig JavaScript ist:
var Foo = {
bar : function() {
alert('I am bar');
},
0 : function() {
alert('I am 1');
},
length : 1
}
Die obige Aufgabe ist ein Array-ähnliches Objekt aus zwei Gründen:
- Es hat Zahlen Mitglieder, die Namen sind , so dass sie wie Array-Indizes
- Es hat eine
length
Eigenschaft, ohne die Sie nicht das Objekt in ein wahres Array mit dem Konstrukt verwandeln: Array.prototype.slice.call(Foo);
Das arguments-Objekt eines Function-Objekts ähnelt in etwa dem Foo-Objekt, nur dass es seinen speziellen Zweck hat.
Ich erhalte einen Objekt Erwartete Fehler auf Scheibe.call in IE –