Rumah  >  Soal Jawab  >  teks badan

javascript - Masalah pelaksanaan indexof array?

Di antaranya

var O = Object(this);
var len = O.length >>> 0;

Apakah maksud kedua-dua ayat ini?

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    var k;
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }
    var O = Object(this);
    var len = O.length >>> 0;
    if (len === 0) {
      return -1;
    }
    var n = +fromIndex || 0;
    if (Math.abs(n) === Infinity) {
      n = 0;
    }
    if (n >= len) {
      return -1;
    }
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
    while (k < len) {
      if (k in O && O[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}
迷茫迷茫2705 hari yang lalu611

membalas semua(1)saya akan balas

  • 我想大声告诉你

    我想大声告诉你2017-06-14 10:56:26

    Objek(ini) bukan untuk mencipta objek baharu, tetapi untuk menukarkannya kepada Objek Ia secara semula jadi tidak berguna untuk objek yang merupakan Objek itu sendiri, seperti Array dan Objek.

    O.length >>> 0这里的三个大于号可不是表示始终大于等于0,而是JS的一个位运算符,表示无符号位移,后面的0表示位移0位,不过JS在执行无符号位移之前,会转成无符号32位整数来计算,所以>>>0表示的就是把O.lengthTukar kepada integer positif.

    Mengapa kita memerlukan dua langkah ini Bukankah Array JS sudah menjadi Objek? Bukankah array.length itu sendiri adalah integer bukan negatif? Itu kerana fungsi ini ialah fungsi universal dan boleh dipanggil oleh bukan Array menggunakan panggilan

    Array.prototype.indexOf.call("abc","c") // 2

    "abc" di sini ialah ini dalam badan fungsi Ia adalah jenis asas dan perlu dibungkus ke dalam Objek untuk menggunakan yang berikut dalam sintaks.

    0 in "ab" // TypeError
    0 in Object("ab") // true

    Dan kita boleh menggunakan kaedah Array.prototype.indexOf bukan sahaja pada jenis asas, tetapi juga pada Objek bukan Array Pada masa ini, panjang ditentukan oleh kita sendiri dan tidak boleh dijamin sebagai integer positif, jadi ia perlu ditukar kepada nilai bukan Array di dalam fungsi.

    var obj = {"0":"hello","1":"world",length:2.7568}
    Array.prototype.indexOf.call(obj,"world") //1

    balas
    0
  • Batalbalas