blob: 7823d5a59c05103e0468daeb84cb0c4496177eaa [file] [log] [blame]
Tim van der Lippefdbd42e2020-04-07 15:14:36 +01001'use strict';
2
Tim van der Lippe2c891972021-07-29 16:22:50 +01003var ToInteger = require('es-abstract/2020/ToInteger');
4var ToLength = require('es-abstract/2020/ToLength');
5var ToObject = require('es-abstract/2020/ToObject');
6var SameValueZero = require('es-abstract/2020/SameValueZero');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +01007var $isNaN = require('es-abstract/helpers/isNaN');
8var $isFinite = require('es-abstract/helpers/isFinite');
Tim van der Lippe2c891972021-07-29 16:22:50 +01009var GetIntrinsic = require('get-intrinsic');
10var callBound = require('call-bind/callBound');
Tim van der Lippefdbd42e2020-04-07 15:14:36 +010011var isString = require('is-string');
12
13var $charAt = callBound('String.prototype.charAt');
14var $indexOf = GetIntrinsic('%Array.prototype.indexOf%'); // TODO: use callBind.apply without breaking IE 8
15
16module.exports = function includes(searchElement) {
17 var fromIndex = arguments.length > 1 ? ToInteger(arguments[1]) : 0;
18 if ($indexOf && !$isNaN(searchElement) && $isFinite(fromIndex) && typeof searchElement !== 'undefined') {
19 return $indexOf.apply(this, arguments) > -1;
20 }
21
22 var O = ToObject(this);
23 var length = ToLength(O.length);
24 if (length === 0) {
25 return false;
26 }
27 var k = fromIndex >= 0 ? fromIndex : Math.max(0, length + fromIndex);
28 while (k < length) {
29 if (SameValueZero(searchElement, isString(O) ? $charAt(O, k) : O[k])) {
30 return true;
31 }
32 k += 1;
33 }
34 return false;
35};