es.array.splice.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. 'use strict';
  2. var $ = require('../internals/export');
  3. var toObject = require('../internals/to-object');
  4. var toAbsoluteIndex = require('../internals/to-absolute-index');
  5. var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
  6. var lengthOfArrayLike = require('../internals/length-of-array-like');
  7. var doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');
  8. var arraySpeciesCreate = require('../internals/array-species-create');
  9. var createProperty = require('../internals/create-property');
  10. var deletePropertyOrThrow = require('../internals/delete-property-or-throw');
  11. var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
  12. var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');
  13. var max = Math.max;
  14. var min = Math.min;
  15. // `Array.prototype.splice` method
  16. // https://tc39.es/ecma262/#sec-array.prototype.splice
  17. // with adding support of @@species
  18. $({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
  19. splice: function splice(start, deleteCount /* , ...items */) {
  20. var O = toObject(this);
  21. var len = lengthOfArrayLike(O);
  22. var actualStart = toAbsoluteIndex(start, len);
  23. var argumentsLength = arguments.length;
  24. var insertCount, actualDeleteCount, A, k, from, to;
  25. if (argumentsLength === 0) {
  26. insertCount = actualDeleteCount = 0;
  27. } else if (argumentsLength === 1) {
  28. insertCount = 0;
  29. actualDeleteCount = len - actualStart;
  30. } else {
  31. insertCount = argumentsLength - 2;
  32. actualDeleteCount = min(max(toIntegerOrInfinity(deleteCount), 0), len - actualStart);
  33. }
  34. doesNotExceedSafeInteger(len + insertCount - actualDeleteCount);
  35. A = arraySpeciesCreate(O, actualDeleteCount);
  36. for (k = 0; k < actualDeleteCount; k++) {
  37. from = actualStart + k;
  38. if (from in O) createProperty(A, k, O[from]);
  39. }
  40. A.length = actualDeleteCount;
  41. if (insertCount < actualDeleteCount) {
  42. for (k = actualStart; k < len - actualDeleteCount; k++) {
  43. from = k + actualDeleteCount;
  44. to = k + insertCount;
  45. if (from in O) O[to] = O[from];
  46. else deletePropertyOrThrow(O, to);
  47. }
  48. for (k = len; k > len - actualDeleteCount + insertCount; k--) deletePropertyOrThrow(O, k - 1);
  49. } else if (insertCount > actualDeleteCount) {
  50. for (k = len - actualDeleteCount; k > actualStart; k--) {
  51. from = k + actualDeleteCount - 1;
  52. to = k + insertCount - 1;
  53. if (from in O) O[to] = O[from];
  54. else deletePropertyOrThrow(O, to);
  55. }
  56. }
  57. for (k = 0; k < insertCount; k++) {
  58. O[k + actualStart] = arguments[k + 2];
  59. }
  60. O.length = len - actualDeleteCount + insertCount;
  61. return A;
  62. }
  63. });