12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- 'use strict';
- var $ = require('../internals/export');
- var isArray = require('../internals/is-array');
- var isConstructor = require('../internals/is-constructor');
- var isObject = require('../internals/is-object');
- var toAbsoluteIndex = require('../internals/to-absolute-index');
- var lengthOfArrayLike = require('../internals/length-of-array-like');
- var toIndexedObject = require('../internals/to-indexed-object');
- var createProperty = require('../internals/create-property');
- var wellKnownSymbol = require('../internals/well-known-symbol');
- var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
- var nativeSlice = require('../internals/array-slice');
-
- var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
-
- var SPECIES = wellKnownSymbol('species');
- var $Array = Array;
- var max = Math.max;
-
- // `Array.prototype.slice` method
- // https://tc39.es/ecma262/#sec-array.prototype.slice
- // fallback for not array-like ES3 strings and DOM objects
- $({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
- slice: function slice(start, end) {
- var O = toIndexedObject(this);
- var length = lengthOfArrayLike(O);
- var k = toAbsoluteIndex(start, length);
- var fin = toAbsoluteIndex(end === undefined ? length : end, length);
- // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
- var Constructor, result, n;
- if (isArray(O)) {
- Constructor = O.constructor;
- // cross-realm fallback
- if (isConstructor(Constructor) && (Constructor === $Array || isArray(Constructor.prototype))) {
- Constructor = undefined;
- } else if (isObject(Constructor)) {
- Constructor = Constructor[SPECIES];
- if (Constructor === null) Constructor = undefined;
- }
- if (Constructor === $Array || Constructor === undefined) {
- return nativeSlice(O, k, fin);
- }
- }
- result = new (Constructor === undefined ? $Array : Constructor)(max(fin - k, 0));
- for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
- result.length = n;
- return result;
- }
- });
|