Ответ в том, что версия polyfill с помощью this.indexOf
не соответствует spec for String.prototype.includes
, что позволяет this
быть что-нибудь конвертируются в строку:
If searchString appears as a substring of the result of converting this object to a String...
Например, this
к includes
может стать номер:
<< String.prototype.includes.call(1, '1')
>> true
Это аналогично String.prototype.indexOf
, который в соответствии с spec также не г equire его this
быть строкой.
<< String.prototype.indexOf.call(1, '1')
>> 0
Если includes
реализуется как ОП предлагает с this.indexOf
:
String.prototype.includes = function(searchString, position) {'use strict';
return this.indexOf(searchString, position) !== -1;
};
Затем вызова includes
с нестроковой this
, как это предусмотрено в спецификации, генерирует ошибку времени выполнения:
<< String.prototype.includes.call(1, '1')
>> TypeError: undefined is not a function
Принимая во внимание, что полигон MDN:
String.prototype.includes = function() {'use strict';
return String.prototype.indexOf.apply(this, arguments) !== -1;
};
работает правильно, пользуясь тем, что this
для String.prototype.indexOf
также не должен быть строкой:
<< String.prototype.includes.call(1, '1')
>> true
Так я себе polyfill MDN написан, что путь не для защиты от indexOf
метода бытия перезаписывается на каком-то конкретном строковом объекте или в виде стенограммы, чтобы избежать необходимости перечислять параметры или из-за некоторых предпочтений Крокфордиан для идиомы prototype.apply
, а скорее для правильной реализации спецификации.
Тогда 'return String (this) .indexOf (searchString, position)! == -1;' будет размещать где * это * не является String и соответствует спецификации. ;-) – RobG
@RobG Не точно, потому что 'String (null') дает вам« null »', и вызов будет «успешным», тогда как 'String.prototype.indexOf.call (null, '1')' генерирует ' String.prototype.indexOf вызвал ошибку с ошибкой null или undefined'. –
Кто положил [* CheckObjectCoercible *] (http://ecma-international.org/ecma-262/5.1/#sec-9.10) там? > :-( – RobG