| '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 setArrayLength = require('../internals/array-set-length'); |
| 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; |
|
|
| |
| |
| |
| $({ 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); |
| |
| var Constructor, result, n; |
| if (isArray(O)) { |
| Constructor = O.constructor; |
| |
| 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]); |
| setArrayLength(result, n); |
| return result; |
| } |
| }); |
|
|