Maison > Questions et réponses > le corps du texte
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;
};
}
我想大声告诉你2017-06-14 10:56:26
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 :
.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