문제

나는 보았다 MDN에서 사용해야 할 코드 - 없으면 indexOf 구현 .

이 알고리즘은 ECMA-262에 지정된 알고리즘과 일치합니다 ... 그들이 말했듯이

그리고 여기 코드가 있습니다.

/*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*/   }

그러나 내 질문은 7 행 7 행에 관한 것입니다.

내가 쓰면 :

[].indexOf 그 다음에 - this 배열 자체입니다. (도대체, 그것은 붙어 있습니다 Array.prototype.indexOf - 먼저).

내말은 - this 항상 진실한 가치가 될 것입니다. 그래서 이 수표가 존재합니까?

또한 - Resharper는 이것을 보여줍니다 (완벽하게 논리적입니다).

enter image description here

그렇다면 - 왜이 점검이 존재합니까? 내가 여기서 뭔가를 놓치고 있습니까?

도움이 되었습니까?

해결책

반드시 그런 것은 아닙니다 indexOf() 기본 기능은 직접을 사용합니다 this 통과 된 값은 객체로 변환되지 않은 값 (엄격한 모드에서 발생하는 것과 동일)이 아니며, 그러한 신은 이것을 준수하기 위해 점검해야합니다. 예를 들어,이 코드는 a를 던집니다 TypeError:

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

그것은 던질 것입니다 TypeError,로 this 값은 객체로 변환되지 않거나 전역 객체로 변경되지 않습니다. 사용자 정의 비 강력 함수에서 값 this 부모 객체가없는 경우 글로벌 객체이지만 ES5 엄격한 모드에서는 다음과 같이 전달됩니다. undefined 그 자체. 또 다른 상황 null 또는 undefined:

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

ES5 사양에서 그만큼 이것 전달 된 원래 값을 말합니다 thisArg, 아무런 변경없이. 비 스트릭 모드에서 그만큼 이것 사용자 정의 함수에서 코드에 액세스 할 수 없지만 기본 기능은 사용을 명시 적으로 지정할 수 있습니다. 그만큼 이것 대신 this 키워드는 ( ThisBinding 사양에서). 엄격한 모드에서는 둘 다 같은 것을 평가합니다.

기본 버전은 비 박사 버전의에 액세스 할 수 있기 때문에 this 비 스트릭 모드의 값 (내부 기능으로 직접 전달됩니다. [[ToObject]], 던지는 a TypeError 전환을 시도했을 때 null 또는 undefined),이 점검은 사양의 요구 사항을 충족시키기 위해 구현해야합니다.

참고 : 기술적으로 질문의 코드 샘플은 상당히 ES5 사양에 따라 this 가치는 거짓일 수 있으며, 이론적으로 진행해야하더라도 실패 할 수 있습니다 (기본 구현 indexOf() 던지지 마십시오 false 로 전달됩니다 this 값). 또한 글로벌 객체가 통과되기 때문에 이 값 실제로 정의되지 않았거나 널이면서 통과 할 것입니다. if (!this) 그렇지 않은 경우에도 테스트하십시오. 이것은 글로벌 객체가 명시 적으로 통과 된 경우 (허용되는) 인수가 글로벌 대상이 아닌지 확인하면 단순히 해결할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top