1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/ */
// for-in loops skip properties with symbol keys, even enumerable properties.
var obj = {};
obj[Symbol.for("moon")] = "sun";
obj[Symbol("asleep")] = "awake";
obj[Symbol.iterator] = "List";
for (var x in obj)
throw "FAIL: " + String(x);
// This includes inherited properties.
var obj2 = Object.create(obj);
for (var x in obj2)
throw "FAIL: " + String(x);
// The same goes for proxies.
var p = new Proxy(obj, {});
for (var x in p)
throw "FAIL: " + String(x);
var p2 = new Proxy(obj2, {});
for (var x in p2)
throw "FAIL: " + String(x);
// Object.keys() and .getOwnPropertyNames() also skip symbols.
assertEq(Object.keys(obj).length, 0);
assertEq(Object.keys(p).length, 0);
assertEq(Object.keys(obj2).length, 0);
assertEq(Object.keys(p2).length, 0);
assertEq(Object.getOwnPropertyNames(obj).length, 0);
assertEq(Object.getOwnPropertyNames(p).length, 0);
assertEq(Object.getOwnPropertyNames(obj2).length, 0);
assertEq(Object.getOwnPropertyNames(p2).length, 0);
// Test interaction of Object.keys(), proxies, and symbol property keys.
var log = [];
var h = {
ownKeys: (t) => {
log.push("ownKeys");
return ["a", "0", Symbol.for("moon"), Symbol("asleep"), Symbol.iterator];
},
getOwnPropertyDescriptor: (t, key) => {
log.push("gopd", key);
return {configurable: true, enumerable: true, value: 0, writable: true};
}
};
p = new Proxy({}, h);
assertDeepEq(Object.keys(p), ["a", "0"]);
assertDeepEq(log, ["ownKeys", "gopd", "a", "gopd", "0"]);
if (typeof reportCompare === "function")
reportCompare(0, 0);
|