ladybird/Userland/Libraries/LibJS/Tests/object-expression-numeric-property.js
Linus Groh 83f61748a5 LibJS: Don't treat 2^32 - 1 as numeric PropertyName
10.4.2 Array Exotic Objects
    https://tc39.es/ecma262/#sec-array-exotic-objects

    A String property name P is an array index if and only if
    ToString(ToUint32(P)) equals P and ToUint32(P) is not the same value
    as 𝔽(2^32 - 1).
2021-07-06 17:29:12 +01:00

30 lines
821 B
JavaScript

test("numeric properties", () => {
const i32Max = 2 ** 31 - 1;
const u32Max = 2 ** 32 - 1;
const o = {
[-1]: "foo",
0: "foo",
1: "foo",
[i32Max - 1]: "foo",
[i32Max]: "foo",
[i32Max + 1]: "foo",
[u32Max - 1]: "foo",
[u32Max]: "foo",
[u32Max + 1]: "foo",
};
// Numeric properties come first in Object.getOwnPropertyNames()'s output,
// which means we can test what each is treated as internally.
expect(Object.getOwnPropertyNames(o)).toEqual([
// Numeric properties
"0",
"1",
"2147483646",
"2147483647",
"2147483648",
"4294967294",
// Non-numeric properties
"-1",
"4294967295", // >= 2^32 - 1
"4294967296", // >= 2^32 - 1
]);
});