50 lines
2.1 KiB
JavaScript
50 lines
2.1 KiB
JavaScript
|
'use strict';
|
||
|
var $ = require('../internals/export');
|
||
|
var isObject = require('../internals/is-object');
|
||
|
var isArray = require('../internals/is-array');
|
||
|
var toAbsoluteIndex = require('../internals/to-absolute-index');
|
||
|
var toLength = require('../internals/to-length');
|
||
|
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 arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
|
||
|
|
||
|
var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
|
||
|
var USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });
|
||
|
|
||
|
var SPECIES = wellKnownSymbol('species');
|
||
|
var nativeSlice = [].slice;
|
||
|
var max = Math.max;
|
||
|
|
||
|
// `Array.prototype.slice` method
|
||
|
// https://tc39.github.io/ecma262/#sec-array.prototype.slice
|
||
|
// fallback for not array-like ES3 strings and DOM objects
|
||
|
$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
|
||
|
slice: function slice(start, end) {
|
||
|
var O = toIndexedObject(this);
|
||
|
var length = toLength(O.length);
|
||
|
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 (typeof Constructor == 'function' && (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.call(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;
|
||
|
}
|
||
|
});
|