javascript - Problème d'implémentation de l'index du tableau?
迷茫
迷茫 2017-06-14 10:54:26
0
1
642

Dont

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

Que signifient ces deux phrases ?

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;
  };
}
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

répondre à tous(1)
我想大声告诉你

Object(this) ne consiste pas à créer un nouvel objet, mais à le convertir en objet. Il est naturellement inutile pour les objets qui sont eux-mêmes des objets, tels que Array et Object.

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

Pourquoi avons-nous besoin de ces deux étapes ? Le tableau de JS n'est-il pas déjà un objet ? array.length lui-même n'est-il pas définitivement un entier non négatif ? C'est parce que cette fonction est une fonction universelle et peut être appelée par un non-Array en utilisant call. Par exemple :

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

Le "abc" ici est celui-ci dans le corps de la fonction. Il s'agit d'un type de base et doit être empaqueté dans un objet pour utiliser la syntaxe suivante.

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

Et nous pouvons utiliser la méthode Array.prototype.indexOf non seulement sur le type de base, mais également sur un objet non-Array. À l'heure actuelle, la longueur est spécifiée par nous-mêmes et ne peut pas être garantie comme étant un entier positif, donc elle. doit être converti en un entier non-Array à l’intérieur de la fonction.

var obj = {"0":"hello","1":"world",length:2.7568}
Array.prototype.indexOf.call(obj,"world") //1
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal