Вопрос

я видел в 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:

Если я напишу:

[].indexOf тогда - this это сам массив. (Черт возьми, он прикреплен к Array.prototype.indexOf - на первом месте).

Я имею в виду - this всегда будет правдивая ценность. так Почему Существует ли эта проверка?

Также - Resharper показывает мне это (что совершенно логично):

enter image description here

Итак - почему эта проверка существует? Я что -то здесь упускаю?

Это было полезно?

Решение

Не обязательно - это потому, что indexOf() Нативная функция использует прямую this Прошло значение, а не преобразовано в объект (эквивалентный тому, что происходит в строгом режиме), и такому марине нужно было бы проверить, чтобы это соответствовало. Например, этот код бросит 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]], что бросает TypeError При попытке преобразовать null или же undefined), этот чек должен реализовать, чтобы удовлетворить требования спецификации.

Примечание. Технически, образец кода в вашем вопросе не довольно по спецификации ES5, как this ценность может быть фальсификацией, что потерпит неудачу, даже если она должна продолжаться в теории (нативные реализации indexOf() не бросай, если false передается как this ценность). Кроме того, поскольку глобальный объект будет пройден, если это значение был фактически неопределенным или нулевым, он прошел if (!this) Проверьте, даже когда это не должно. Это не может быть решено просто путем проверки того, что аргумент не является глобальным объектом, потому что это не удастся, если глобальный объект будет явно прошел (что разрешено).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top