Vra

ek het gesien by mdn die kode wat gebruik moet word - indien daar geen indexOf implementering.

Hierdie algoritme pas by die een gespesifiseer in ECMA-262 ...soos hulle sê

En hier is die kode:

/*1*/   if (!Array.prototype.indexOf) {
/*2*/     Array.prototype.indexOf = function (searchElement , fromIndex) {
/*3*/       var i,
/*4*/           pivot = (fromIndex) ? fromIndex : 0,
/*5*/           length;
/*6*/   
/*7*/       if (!this) {
/*8*/         throw new TypeError();
/*9*/       }
/*10*/   
/*11*/       length = this.length;
/*12*/   
/*13*/       if (length === 0 || pivot >= length) {
/*14*/         return -1;
/*15*/       }
/*16*/   
/*17*/       if (pivot < 0) {
/*18*/         pivot = length - Math.abs(pivot);
/*19*/       }
/*20*/   
/*21*/       for (i = pivot; i < length; i++) {
/*22*/         if (this[i] === searchElement) {
/*23*/           return i;
/*24*/         }
/*25*/       }
/*26*/       return -1;
/*27*/     };
/*28*/   }

Maar my vraag is oor reël #7:

As ek skryf:

[].indexOf dan - this is die skikking self.(Heck, dit is geheg aan Array.prototype.indexOf - op die eerste plek).

Ek bedoel - this sal altyd ware waarde wees.so hoekom bestaan ​​hierdie tjek?

Ook - Resharper wys my dit (wat heeltemal logies is):

enter image description here

So - hoekom bestaan ​​hierdie tjek?Mis ek iets hier?

Was dit nuttig?

Oplossing

Nie noodwendig nie -- dit is omdat die indexOf() inheemse funksie gebruik die direkte this waarde wat deurgegee is, nie die een wat na 'n voorwerp omgeskakel is nie (gelykstaande aan wat in 'n streng modus gebeur), en so 'n shim sal moet kontroleer dat dit voldoen.Byvoorbeeld, hierdie kode sal 'n gooi TypeError:

var a = Array.prototype.indexOf;
a();

Dit sal 'n gooi TypeError, as die this waarde word nie in 'n voorwerp omgeskakel of na die globale voorwerp verander nie.In gebruiker-gedefinieerde nie-streng funksies, die waarde van this is die globale voorwerp as daar geen ouervoorwerp is nie, maar in ES5 streng modus word dit deurgegee as undefined self.Nog 'n situasie is wanneer jy dit spesifiek met een van die twee noem null of undefined:

"use strict";
Array.prototype.indexOf.call(null); // TypeError, what else can we do?

In die ES5-spesifikasie, die hierdie waarde verwys na die oorspronklike waarde wat as die thisArg, sonder enige veranderinge.In nie-streng modus, die hierdie waarde is nie toeganklik vir kode in gebruikergedefinieerde funksies nie, maar inheemse funksies is in staat om eksplisiet gebruik van die hierdie waarde in plaas van wat die this sleutelwoord evalueer na (wat na verwys word as die ThisBinding in die spesifikasie).In streng modus evalueer hulle albei na dieselfde ding.

Omdat die oorspronklike weergawe in staat is om toegang tot die nie-boks weergawe van die this waarde in nie-streng modus (wat direk na die interne funksie oorgedra word [[ToObject]], wat gooi 'n TypeError by 'n poging om te bekeer null of undefined), moet hierdie kontrole geïmplementeer word om aan die vereistes van die spesifikasie te voldoen.

Let wel:tegnies is die kodevoorbeeld in jou vraag nie nogal deur die ES5-spesifikasie, soos die this waarde kan vals wees, wat dit sal misluk, selfs al moet dit in teorie voortgaan (inheemse implementering van indexOf() gooi nie as false word deurgegee as die this waarde).Sowel, aangesien die globale voorwerp geslaag sou word as hierdie waarde eintlik ongedefinieerd of nul was, sou dit die if (!this) toets, selfs wanneer dit nie veronderstel is nie.Dit kan nie opgelos word bloot deur te kontroleer dat die argument nie die globale voorwerp is nie, want dit sal misluk as die globale voorwerp eksplisiet geslaag word (wat toegelaat word).

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top