X-Git-Url: https://git.ladys.computer/Pisces/blobdiff_plain/e272aec320bec47125cd7922e1d1ed5f65e37e1f..beab7268e7673b036222e64aac924f850e2b976e:/object.js diff --git a/object.js b/object.js index 3052f15..ee3d51d 100644 --- a/object.js +++ b/object.js @@ -14,6 +14,7 @@ import { toFunctionName, } from "./function.js"; import { + IS_CONCAT_SPREADABLE, ITERATOR, SPECIES, toLength, @@ -501,24 +502,9 @@ export const { isSealed, setPrototypeOf, } = Object; - const { [ITERATOR]: arrayIterator } = Array.prototype; - const { next: arrayIteratorNext } = getPrototypeOf([][ITERATOR]()); const { next: generatorIteratorNext, } = getPrototypeOf(function* () {}.prototype); - const splatIterablePrototype = { - [ITERATOR]() { - return { - next: bind( - arrayIteratorNext, - call(arrayIterator, this.args, []), - [], - ), - }; - }, - }; - const splatIterable = ($) => - create(splatIterablePrototype, { args: { value: $ } }); const propertyDescriptorEntryIterablePrototype = { [ITERATOR]() { return { @@ -533,8 +519,9 @@ export const { return { defineOwnProperties: (O, ...sources) => { - for (const source of splatIterable(sources)) { - defineProperties(O, source); + const { length } = sources; + for (let index = 0; index < length; ++index) { + defineProperties(O, sources[index]); } return O; }, @@ -824,6 +811,32 @@ export const isArraylikeObject = ($) => { } }; +export const { + /** + * Returns whether the provided value is spreadable during array + * concatenation. + * + * This is also used to determine which things should be treated as + * collections. + */ + isConcatSpreadableObject, +} = (() => { + const { isArray } = Array; + + return { + isConcatSpreadableObject: ($) => { + if (type($) !== "object") { + // The provided value is not an object. + return false; + } else { + // The provided value is an object. + const spreadable = $[IS_CONCAT_SPREADABLE]; + return spreadable !== undefined ? !!spreadable : isArray($); + } + }, + }; +})(); + /** * Returns whether the provided object is extensible. *