12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import equals from "../equals.js";
- export default function _indexOf(list, a, idx) {
- var inf, item; // Array.prototype.indexOf doesn't exist below IE9
- if (typeof list.indexOf === 'function') {
- switch (typeof a) {
- case 'number':
- if (a === 0) {
- // manually crawl the list to distinguish between +0 and -0
- inf = 1 / a;
- while (idx < list.length) {
- item = list[idx];
- if (item === 0 && 1 / item === inf) {
- return idx;
- }
- idx += 1;
- }
- return -1;
- } else if (a !== a) {
- // NaN
- while (idx < list.length) {
- item = list[idx];
- if (typeof item === 'number' && item !== item) {
- return idx;
- }
- idx += 1;
- }
- return -1;
- } // non-zero numbers can utilise Set
- return list.indexOf(a, idx);
- // all these types can utilise Set
- case 'string':
- case 'boolean':
- case 'function':
- case 'undefined':
- return list.indexOf(a, idx);
- case 'object':
- if (a === null) {
- // null can utilise Set
- return list.indexOf(a, idx);
- }
- }
- } // anything else not covered above, defer to R.equals
- while (idx < list.length) {
- if (equals(list[idx], a)) {
- return idx;
- }
- idx += 1;
- }
- return -1;
- }
|