/** The undefined primitive. */
export const UNDEFINED = undefined;
+/**
+ * Returns −0 if the provided argument is `"-0"´; returns a number
+ * representing the index if the provided argument is a canonical
+ * numeric index string; otherwise, returns undefined.
+ *
+ * There is no clamping of the numeric index, but note that numbers
+ * above 2^53 − 1 are not safe nor valid integer indices.
+ */
+export const canonicalNumericIndexString = ($) => {
+ if (typeof $ !== "string") {
+ return UNDEFINED;
+ } else if ($ === "-0") {
+ return -0;
+ } else {
+ const n = +$;
+ return $ === `${n}` ? n : UNDEFINED;
+ }
+};
+
/**
* Completes the provided property descriptor by setting missing values
* to their defaults.
export const isAccessorDescriptor = (Desc) =>
Desc !== UNDEFINED && ("get" in Desc || "set" in Desc);
+/** Returns whether the provided value is an array index. */
+export const isArrayIndexString = ($) => {
+ const value = canonicalNumericIndexString($);
+ if (value !== UNDEFINED) {
+ // The provided value is a canonical numeric index string.
+ //
+ // Return whether it is in range for array indices.
+ return sameValue(value, 0)
+ || value === toLength(value) && value > 0 && value < -1 >>> 0;
+ } else {
+ // The provided value is not a canonical numeric index string.
+ return false;
+ }
+};
+
/** Gets whether the provided value is a data descrtiptor. */
export const isDataDescriptor = (Desc) =>
Desc !== UNDEFINED && ("value" in Desc || "writable" in Desc);
&& !("get" in Desc || "set" in Desc || "value" in Desc
|| "writable" in Desc);
+/** Returns whether the provided value is an integer index string. */
+export const isIntegerIndexString = ($) => {
+ const value = canonicalNumericIndexString($);
+ if (value !== UNDEFINED) {
+ // The provided value is a canonical numeric index string.
+ //
+ // Return whether it is in range for integer indices.
+ return sameValue(value, 0)
+ || value === toLength(value) && value > 0;
+ } else {
+ // The provided value is not a canonical numeric index string.
+ return false;
+ }
+};
+
export const {
/**
* Returns the primitive value of the provided object per its
const { isNaN: isNan } = Number;
const { is } = Object;
return {
- sameValue: (a, b) => is(a, b),
+ sameValue: ($1, $2) => is($1, $2),
sameValueZero: ($1, $2) => {
const type1 = type($1);
const type2 = type($2);