Array verfügt nicht über eine indexOf-Methode, daher ist es schwierig, den Index eines Elements in einem Array zu finden. Zur Vereinfachung des Aufrufs wird Array.prototype.indexOf() durch den Prototyp-Prototyp erweitert, was es einfacher macht bequem zu verwenden. Beim Durchlaufen des Arrays gab es jedoch ein Problem mit diesem benutzerdefinierten indexOf.
Array.prototype.indexOf = function(item) {
for (var i = 0; i < this.length; i ) {
if (this[i] == item)
gib i zurück
}
return -1;
}
Direkt bei Verwendung von
var arr=[1,2,3,4,5];
var index=arr.indexOf(1); //index==0
Nach der Erweiterung ist es sehr komfortabel und bequem zu bedienen und schafft eine harmonische Szene...
Aber einmal wurde beim Durchlaufen von Array-Elementen eine for..in..-Schleife verwendet, was andere Probleme verursachte und die harmonische Atmosphäre störte.
var a=["Zhang Fei", "Guan Yu", "Liu Bei", "Lü Bu"];
for(var p in a){
document.write(p "=" a[p] "
");
}
Ursprünglich wollte ich die Namen dieser vier Personen ausgeben, aber was wurde ausgegeben?
Die Ausgabe lautet tatsächlich:
//1=Guan Yu
//2=Liu Bei
//3=Lu Bu
//indexOf=function(item) { for (var i = 0; i < this.length; i ) { if (this[i] == item) return i }
Zusätzlich zur Eingabe des Namens wird auch eine eigene erweiterte Methode indexOf ausgegeben. Das Verrückte ist jedoch, dass Firefox „normal“ ist und nur die Namen von vier Personen enthält.
AusgabeindexOf, der selbst erweitert werden kann, was verständlich ist. Schließlich durchläuft for..in alle benutzerdefinierten Attribute eines Objekts oder alle Elemente eines Arrays.
Warum also nicht Firefox?
Ich habe es später herausgefunden, nachdem ich die Informationen überprüft hatte,
Array unterstützt bereits Array.indexOf() in Javascript-Version 1.6, und das von mir verwendete Firefox ist Version 3.5, das bereits Javascript 1.8 unterstützt. IndexOf ist eine inhärente Methode von Array selbst.
Obwohl ich IE8 verwende, unterstützt der IE nur Version 1.3 von JavaScript.
Daher betrachtet IE8 indexOf als ein „benutzerdefiniertes Attribut“, während Firefox es als ein inhärentes Attribut betrachtet, das von sich selbst nativ unterstützt wird.
Ist das wirklich so?
Führen Sie ein Experiment durch, benennen Sie indexOf in myIndexOf um und versuchen Sie es erneut. Als Ergebnis geben sowohl IE als auch Firefox myIndexOf aus, was beweist, dass der vorherige Punkt korrekt ist.
Dann kommt hier ein weiteres Problem. Jetzt verwenden viele Projektcodes diese Methode, aber jetzt muss ich for..in verwenden, um die Elemente des Arrays selbst auszugeben. Ich möchte es nicht selbst verlängern. Was soll ich tun, wenn ich nach Russland komme?
Glücklicherweise stellt Javascript die Methode hasOwnProperty bereit.
Schauen Sie sich die Beschreibung an:
Code kopieren
Der Code lautet wie folgt:
Jedes von Object abgeleitete Objekt erbt die Methode hasOwnProperty. Diese Methode kann verwendet werden, um zu bestimmen, ob ein Objekt die angegebene Eigenschaft als direkte Eigenschaft dieses Objekts hat. Diese Methode überprüft nicht die Prototypenkette des Objekts
Wenn man sich die Beschreibung ansieht, ist es genau das, was wir wollen.
Machen Sie einfach ein Urteil für...in... und es ist OK
Code kopieren
Darüber hinaus finden Sie hier ein Beispiel für die Verwendung von hasOwnProperty aus dem Internet:
Code kopieren
Der Code lautet wie folgt:
Funktion Buch(Titel, Autor) {
this.title = Titel;
this.author = Autor;
}
Book.prototype.price = 9,99;
Object.prototype.copyright = "herongyang.com";
var myBook = new Book("JavaScript Tutorials", "Herong Yang");
// Integrierte Eigenschaften auf der Ebene des Basisprototyps ausgeben
document.writeln("/nObject.prototype's integrierte Eigenschaften:");
dumpProperty(Object.prototype, "constructor");
dumpProperty(Object.prototype, "hasOwnProperty");
dumpProperty(Object.prototype, "isPrototypeOf");
dumpProperty(Object.prototype, "toString");
dumpProperty(Object.prototype, "valueOf");
dumpProperty(Object.prototype, "copyright");
// Integrierte Eigenschaften auf der Ebene „Mein Prototyp“ ausgeben
document.writeln("/n==================/nBook.prototype's integrierte Eigenschaften:");
dumpProperty(Book.prototype, "constructor");
dumpProperty(Book.prototype, "hasOwnProperty");
dumpProperty(Book.prototype, "isPrototypeOf");
dumpProperty(Book.prototype, "toString");
dumpProperty(Book.prototype, "valueOf");
dumpProperty(Book.prototype, "copyright");
// Integrierte Eigenschaften auf Objektebene ausgeben
document.writeln("/n==================/nmyBook's integrierte Eigenschaften:");
dumpProperty(myBook, "constructor");
dumpProperty(myBook, "hasOwnProperty");
dumpProperty(myBook, "isPrototypeOf");
dumpProperty(myBook, "toString");
dumpProperty(myBook, "valueOf");
dumpProperty(myBook, "copyright");
Funktion dumpProperty(object, property) {
Var-Vererbung;
if (object.hasOwnProperty(property))
Vererbung = „Lokal“;
sonst
inheritance = „Geerbt“;
document.writeln(property ": " inheritance ": "
Objekt[Eigenschaft]);
}
查看浏览器支持javascript到哪个版本:
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
http://www.w3.org/1999/xhtml">
Browser-JavaScript-Versionsunterstützungstest