Rumah >hujung hadapan web >tutorial js >Masalah dan penyelesaian yang disebabkan oleh melanjutkan Array.prototype.indexOf untuk pengetahuan JS_Basic

Masalah dan penyelesaian yang disebabkan oleh melanjutkan Array.prototype.indexOf untuk pengetahuan JS_Basic

WBOY
WBOYasal
2016-05-16 16:18:361305semak imbas

Array tidak mempunyai kaedah indexOf, jadi menyusahkan untuk mencari indeks elemen dalam tatasusunan Untuk kemudahan membuat panggilan, Array.prototype.indexOf() dilanjutkan melalui prototaip prototaip, yang menjadikannya lebih. mudah digunakan. Tetapi terdapat masalah dengan indexOf tersuai ini semasa melintasi tatasusunan.

Salin kod Kod adalah seperti berikut:

Array.prototype.indexOf = function(item) {
untuk (var i = 0; i < this.length; i ) {
jika (ini[i] == item)
kembalikan i;
}
pulangkan -1;
}

Secara langsung apabila menggunakan

Salin kod Kod adalah seperti berikut:

var arr=[1,2,3,4,5]; var index=arr.indexOf(1); //index==0

Selepas pengembangan, ia sangat selesa dan mudah digunakan, mewujudkan pemandangan yang harmoni...

Tetapi suatu ketika ketika melintasi elemen tatasusunan, gelung for..in.. digunakan, yang menyebabkan masalah lain dan memecahkan suasana harmoni.

Salin kod Kod adalah seperti berikut:
var a=["Zhang Fei","Guan Yu", "Liu Bei", "Lü Bu"]; untuk(var p dalam a){
document.write(p "=" a[p] "
");
}


Saya pada asalnya ingin mengeluarkan nama empat orang ini, tetapi apakah yang dikeluarkan?

Output sebenarnya:

//0=Zhang Fei
//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 } return -1;


Selain menaip nama, ia juga mengeluarkan kaedah lanjutan indexOf Tetapi perkara gila ialah Firefox adalah "biasa" dan hanya mempunyai nama empat orang.

Output indexOf, yang boleh dikembangkan dengan sendirinya, yang boleh difahami Lagipun, kerana..in merentasi semua atribut yang ditentukan pengguna bagi objek atau semua elemen tatasusunan.

Jadi mengapa tidak firefox?

Saya mendapat tahu kemudian selepas menyemak maklumat,

Array sudah pun menyokong Array.indexOf() dalam versi javascript 1.6, dan firefox yang saya gunakan ialah versi 3.5, yang sudah menyokong javascript 1.8 IndexOf ialah kaedah yang wujud bagi Array itu sendiri.

Bagi IE, walaupun saya menggunakan IE8, ia hanya menyokong versi 1.3 JavaScript.

Jadi IE8 menganggap indexOf sebagai "atribut yang ditentukan pengguna", manakala Firefox menganggapnya sebagai atribut bawaan yang disokong sendiri secara asli.

Adakah ini benar-benar berlaku?

Lakukan percubaan, namakan semula indexOf kepada myIndexOf, dan cuba lagi Akibatnya, kedua-dua IE dan firefox mengeluarkan myIndexOf, yang membuktikan bahawa perkara sebelumnya adalah betul.

Kemudian di sini datang satu lagi masalah saya telah memanjangkan indexOf untuk masa yang lama Sekarang banyak kod projek telah menggunakan kaedah ini, tetapi sekarang saya perlu menggunakan untuk..in untuk mengeluarkan elemen tatasusunan itu sendiri. t mahu memanjangkannya sendiri. Apa yang perlu saya lakukan jika saya sampai ke Rusia?

Nasib baik, javascript menyediakan kaedah hasOwnProperty.

Lihat penerangannya:

Salin kod Kod adalah seperti berikut: Setiap objek yang diturunkan daripada Object mewarisi kaedah hasOwnProperty Kaedah ini boleh digunakan untuk menentukan sama ada objek mempunyai sifat yang ditentukan sebagai sifat langsung objek tersebut, tidak seperti operator dalam, kaedah ini tidak menyemak rantai prototaip objek itu


Melihat penerangan, itulah yang kita mahukan.

Hanya buat penilaian untuk...dalam.. dan tidak mengapa

Salin kod Kod adalah seperti berikut: jika(a.mempunyaiHartanahSendiri(p)){
                  document.write(p "=" a[p] "
"
}



Selain itu, berikut ialah contoh cara menggunakan hasOwnProperty, yang diperoleh daripada Internet:

Salin kod Kod adalah seperti berikut:

Buku fungsi(tajuk, pengarang) { 
   this.title = tajuk; 
   ini.pengarang = pengarang; 
  } 
   Book.prototype.price = 9.99; 
   Object.prototype.copyright = "herongyang.com"; 
   var myBook = new Book("Tutorial JavaScript", "Herong Yang"); 
   // Lambakan sifat terbina dalam pada tahap prototaip asas 
   document.writeln("/nObject.prototype's built-in properties:"); 
   dumpProperty(Object.prototype, "constructor"); 
   dumpProperty(Object.prototype, "hasOwnProperty"); 
   dumpProperty(Object.prototype, "isPrototypeOf"); 
   dumpProperty(Object.prototype, "toString"); 
   dumpProperty(Object.prototype, "valueOf"); 
   dumpProperty(Object.prototype, "hak cipta"); 
   // Lambakan sifat terbina dalam pada tahap prototaip saya 
   document.writeln("/n================================/nBook.prototype's built-in properties:"); 
   dumpProperty(Book.prototype, "pembina"); 
   dumpProperty(Book.prototype, "hasOwnProperty"); 
   dumpProperty(Book.prototype, "isPrototypeOf"); 
   dumpProperty(Book.prototype, "toString"); 
   dumpProperty(Book.prototype, "valueOf"); 
   dumpProperty(Book.prototype, "hak cipta"); 
   // Melambakkan sifat terbina dalam pada tahap objek 
   document.writeln("/n================================/sifat terbina dalam nmyBook:"); 
   dumpProperty(myBook, "pembina"); 
   dumpProperty(myBook, "hasOwnProperty"); 
   dumpProperty(myBook, "isPrototypeOf"); 
   dumpProperty(myBook, "toString"); 
   dumpProperty(myBook, "valueOf"); 
   dumpProperty(myBook, "hak cipta"); 
fungsi dumpProperty(objek, harta) { 
   var warisan;  
   if (object.hasOwnProperty(property))  
      warisan = "Tempatan"; 
   lain 
      warisan = "Diwarisi"; 
   document.writeln(property ": " warisan ": "
      objek [harta]); 
}

查看浏览器支持javascript到哪个版本:

复制代码 代码如下:

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
http://www.w3.org/1999/xhtml">
Ujian sokongan versi JavaScript pelayar