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;
};
}
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.length
Convertir 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 :
.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.
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.