Created by William Kapke
kangax's compat-table applied only to Node.js
githubLearn more

Node.js ES2015 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!99% complete99% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
99% complete99% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
99% complete99% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
99% complete99% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
99% complete99% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
99% complete99% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
99% complete99% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
99% complete99% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
99% complete99% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
99% complete99% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
99% complete99% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
99% complete99% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
99% complete99% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
99% complete99% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
99% complete99% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
99% complete99% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
99% complete99% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
99% complete99% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
99% complete99% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
99% complete99% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
99% complete99% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
99% complete99% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
99% complete99% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
99% complete99% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
99% complete99% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
99% complete99% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
99% complete99% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
99% complete99% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
99% complete99% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
99% complete99% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
99% complete99% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
99% complete99% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
99% complete99% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
99% complete99% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
99% complete99% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
99% complete99% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
99% complete99% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
99% complete99% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
99% complete99% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
99% complete99% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
99% complete99% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
99% complete98% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
98% complete98% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
99% complete98% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
95% complete91% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
57% complete46% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
47% complete43% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
29% complete22% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
10% complete6% complete

optimisation

proper tail calls (tail call optimisation)

§direct recursion
?
function(){
"use strict"; return (function f(n){ if (n <= 0) { return "foo"; } return f(n - 1); }(1e6)) === "foo";
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
"use strict"; return (function f(n){ if (n <= 0) { return "foo"; } return f(n - 1); }(1e6)) === "foo";
}
§mutual recursion
?
function(){
"use strict"; function f(n){ if (n <= 0) { return "foo"; } return g(n - 1); } function g(n){ if (n <= 0) { return "bar"; } return f(n - 1); } return f(1e6) === "foo" && f(1e6+1) === "bar";
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
"use strict"; function f(n){ if (n <= 0) { return "foo"; } return g(n - 1); } function g(n){ if (n <= 0) { return "bar"; } return f(n - 1); } return f(1e6) === "foo" && f(1e6+1) === "bar";
}

syntax

default function parameters

§basic functionality
?
function(){
return (function (a = 1, b = 2) { return a === 3 && b === 2; }(3));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function (a = 1, b = 2) { return a === 3 && b === 2; }(3));
}
§explicit undefined defers to the default
?
function(){
return (function (a = 1, b = 2) { return a === 1 && b === 3; }(undefined, 3));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function (a = 1, b = 2) { return a === 1 && b === 3; }(undefined, 3));
}
§defaults can refer to previous params
?
function(){
return (function (a, b = a) { return b === 5; }(5));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function (a, b = a) { return b === 5; }(5));
}
§arguments object interaction
?
function(){
return (function (a = "baz", b = "qux", c = "quux") { a = "corge"; // The arguments object is not mapped to the // parameters, even outside of strict mode. return arguments.length === 2 && arguments[0] === "foo" && arguments[1] === "bar"; }("foo", "bar"));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function (a = "baz", b = "qux", c = "quux") { a = "corge"; // The arguments object is not mapped to the // parameters, even outside of strict mode. return arguments.length === 2 && arguments[0] === "foo" && arguments[1] === "bar"; }("foo", "bar"));
}
§temporal dead zone
?
function(){
return (function(x = 1) { try { eval("(function(a=a){}())"); return false; } catch(e) {} try { eval("(function(a=b,b){}())"); return false; } catch(e) {} return true; }());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function(x = 1) { try { eval("(function(a=a){}())"); return false; } catch(e) {} try { eval("(function(a=b,b){}())"); return false; } catch(e) {} return true; }());
}
§separate scope
?
function(){
return (function(a=function(){ return typeof b === 'undefined'; }){ var b = 1; return a(); }());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function(a=function(){ return typeof b === 'undefined'; }){ var b = 1; return a(); }());
}
§new Function() support
?
function(){
return new Function("a = 1", "b = 2", "return a === 3 && b === 2;" )(3);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new Function("a = 1", "b = 2", "return a === 3 && b === 2;" )(3);
}

rest parameters

§basic functionality
?
function(){
return (function (foo, ...args) { return args instanceof Array && args + "" === "bar,baz"; }("foo", "bar", "baz"));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
function(){
return (function (foo, ...args) { return args instanceof Array && args + "" === "bar,baz"; }("foo", "bar", "baz"));
}
§function 'length' property
?
function(){
return function(a, ...b){}.length === 1 && function(...c){}.length === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
function(){
return function(a, ...b){}.length === 1 && function(...c){}.length === 0;
}
§arguments object interaction
?
function(){
return (function (foo, ...args) { foo = "qux"; // The arguments object is not mapped to the // parameters, even outside of strict mode. return arguments.length === 3 && arguments[0] === "foo" && arguments[1] === "bar" && arguments[2] === "baz"; }("foo", "bar", "baz"));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
function(){
return (function (foo, ...args) { foo = "qux"; // The arguments object is not mapped to the // parameters, even outside of strict mode. return arguments.length === 3 && arguments[0] === "foo" && arguments[1] === "bar" && arguments[2] === "baz"; }("foo", "bar", "baz"));
}
§can't be used in setters
?
function(){
return (function (...args) { try { eval("({set e(...args){}})"); } catch(e) { return true; } }());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
function(){
return (function (...args) { try { eval("({set e(...args){}})"); } catch(e) { return true; } }());
}
§new Function() support
?
function(){
return new Function("a", "...b", "return b instanceof Array && a+b === 'foobar,baz';" )('foo','bar','baz');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
function(){
return new Function("a", "...b", "return b instanceof Array && a+b === 'foobar,baz';" )('foo','bar','baz');
}

spread syntax for iterable objects

§with arrays, in function calls
?
function(){
return Math.max(...[1, 2, 3]) === 3
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
return Math.max(...[1, 2, 3]) === 3
}
§with arrays, in array literals
?
function(){
return [...[1, 2, 3]][2] === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
return [...[1, 2, 3]][2] === 3;
}
§with sparse arrays, in function calls
?
function(){
var a = Array(...[,,]); return "0" in a && "1" in a && '' + a[0] + a[1] === "undefinedundefined";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
var a = Array(...[,,]); return "0" in a && "1" in a && '' + a[0] + a[1] === "undefinedundefined";
}
§with sparse arrays, in array literals
?
function(){
var a = [...[,,]]; return "0" in a && "1" in a && '' + a[0] + a[1] === "undefinedundefined";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
var a = [...[,,]]; return "0" in a && "1" in a && '' + a[0] + a[1] === "undefinedundefined";
}
§with strings, in function calls
?
function(){
return Math.max(..."1234") === 4;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
return Math.max(..."1234") === 4;
}
§with strings, in array literals
?
function(){
return ["a", ..."bcd", "e"][3] === "d";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
return ["a", ..."bcd", "e"][3] === "d";
}
§with astral plane strings, in function calls
?
function(){
return Array(..."𠮷𠮶")[0] === "𠮷";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
return Array(..."𠮷𠮶")[0] === "𠮷";
}
§with astral plane strings, in array literals
?
function(){
return [..."𠮷𠮶"][0] === "𠮷";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
return [..."𠮷𠮶"][0] === "𠮷";
}
§with generator instances, in calls
?
function(){
var iterable = (function*(){ yield 1; yield 2; yield 3; }()); return Math.max(...iterable) === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
var iterable = (function*(){ yield 1; yield 2; yield 3; }()); return Math.max(...iterable) === 3;
}
§with generator instances, in arrays
?
function(){
var iterable = (function*(){ yield "b"; yield "c"; yield "d"; }()); return ["a", ...iterable, "e"][3] === "d";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
var iterable = (function*(){ yield "b"; yield "c"; yield "d"; }()); return ["a", ...iterable, "e"][3] === "d";
}
§with generic iterables, in calls
?
function(){
var iterable = global.__createIterableObject([1, 2, 3]); return Math.max(...iterable) === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
var iterable = global.__createIterableObject([1, 2, 3]); return Math.max(...iterable) === 3;
}
§with generic iterables, in arrays
?
function(){
var iterable = global.__createIterableObject(["b", "c", "d"]); return ["a", ...iterable, "e"][3] === "d";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
var iterable = global.__createIterableObject(["b", "c", "d"]); return ["a", ...iterable, "e"][3] === "d";
}
§with instances of iterables, in calls
?
function(){
var iterable = global.__createIterableObject([1, 2, 3]); return Math.max(...Object.create(iterable)) === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
var iterable = global.__createIterableObject([1, 2, 3]); return Math.max(...Object.create(iterable)) === 3;
}
§with instances of iterables, in arrays
?
function(){
var iterable = global.__createIterableObject(["b", "c", "d"]); return ["a", ...Object.create(iterable), "e"][3] === "d";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
var iterable = global.__createIterableObject(["b", "c", "d"]); return ["a", ...Object.create(iterable), "e"][3] === "d";
}
§spreading non-iterables is a runtime error
?
function(){
try { Math.max(...2); } catch(e) { return Math.max(...[1, 2, 3]) === 3; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
function(){
try { Math.max(...2); } catch(e) { return Math.max(...[1, 2, 3]) === 3; }
}

object literal extensions

§computed properties
?
function(){
var x = 'y'; return ({ [x]: 1 }).y === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var x = 'y'; return ({ [x]: 1 }).y === 1;
}
§shorthand properties
?
function(){
var a = 7, b = 8, c = {a,b}; return c.a === 7 && c.b === 8;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var a = 7, b = 8, c = {a,b}; return c.a === 7 && c.b === 8;
}
§shorthand methods
?
function(){
return ({ y() { return 2; } }).y() === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return ({ y() { return 2; } }).y() === 2;
}
§string-keyed shorthand methods
?
function(){
return ({ "foo bar"() { return 4; } })["foo bar"]() === 4;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return ({ "foo bar"() { return 4; } })["foo bar"]() === 4;
}
§computed shorthand methods
?
function(){
var x = 'y'; return ({ [x](){ return 1 } }).y() === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var x = 'y'; return ({ [x](){ return 1 } }).y() === 1;
}
§computed accessors
?
function(){
var x = 'y', valueSet, obj = { get [x] () { return 1 }, set [x] (value) { valueSet = value } }; obj.y = 'foo'; return obj.y === 1 && valueSet === 'foo';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var x = 'y', valueSet, obj = { get [x] () { return 1 }, set [x] (value) { valueSet = value } }; obj.y = 'foo'; return obj.y === 1 && valueSet === 'foo';
}

for..of loops

§with arrays
?
function(){
var arr = [5]; for (var item of arr) return item === 5;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var arr = [5]; for (var item of arr) return item === 5;
}
§with sparse arrays
?
function(){
var arr = [,,]; var count = 0; for (var item of arr) count += (item === void undefined); return count === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var arr = [,,]; var count = 0; for (var item of arr) count += (item === void undefined); return count === 2;
}
§with strings
?
function(){
var str = ""; for (var item of "foo") str += item; return str === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var str = ""; for (var item of "foo") str += item; return str === "foo";
}
§with astral plane strings
?
function(){
var str = ""; for (var item of "𠮷𠮶") str += item + " "; return str === "𠮷 𠮶 ";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var str = ""; for (var item of "𠮷𠮶") str += item + " "; return str === "𠮷 𠮶 ";
}
§with generator instances
?
function(){
var result = ""; var iterable = (function*(){ yield 1; yield 2; yield 3; }()); for (var item of iterable) { result += item; } return result === "123";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var result = ""; var iterable = (function*(){ yield 1; yield 2; yield 3; }()); for (var item of iterable) { result += item; } return result === "123";
}
§with generic iterables
?
function(){
var result = ""; var iterable = global.__createIterableObject([1, 2, 3]); for (var item of iterable) { result += item; } return result === "123";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var result = ""; var iterable = global.__createIterableObject([1, 2, 3]); for (var item of iterable) { result += item; } return result === "123";
}
§with instances of generic iterables
?
function(){
var result = ""; var iterable = global.__createIterableObject([1, 2, 3]); for (var item of Object.create(iterable)) { result += item; } return result === "123";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var result = ""; var iterable = global.__createIterableObject([1, 2, 3]); for (var item of Object.create(iterable)) { result += item; } return result === "123";
}
§iterator closing, break
?
function(){
var closed = false; var iter = __createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); for (var it of iter) break; return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
Error
Error
function(){
var closed = false; var iter = __createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); for (var it of iter) break; return closed;
}
§iterator closing, throw
?
function(){
var closed = false; var iter = __createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { for (var it of iter) throw 0; } catch(e){} return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
Error
Error
function(){
var closed = false; var iter = __createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { for (var it of iter) throw 0; } catch(e){} return closed;
}

octal and binary literals

§octal literals
?
function(){
return 0o10 === 8 && 0O10 === 8;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
return 0o10 === 8 && 0O10 === 8;
}
§binary literals
?
function(){
return 0b10 === 2 && 0B10 === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
return 0b10 === 2 && 0B10 === 2;
}
§octal supported by Number()
?
function(){
return Number('0o1') === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return Number('0o1') === 1;
}
§binary supported by Number()
?
function(){
return Number('0b1') === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return Number('0b1') === 1;
}

template literals

§basic functionality
?
function(){
var a = "ba", b = "QUX"; return `foo bar ${a + "z"} ${b.toLowerCase()}` === "foo bar\nbaz qux";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var a = "ba", b = "QUX"; return `foo bar ${a + "z"} ${b.toLowerCase()}` === "foo bar\nbaz qux";
}
§toString conversion
?
function(){
var a = { toString: function() { return "foo"; }, valueOf: function() { return "bar"; } }; return `${a}` === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var a = { toString: function() { return "foo"; }, valueOf: function() { return "bar"; } }; return `${a}` === "foo";
}
§tagged template literals
?
function(){
var called = false; function fn(parts, a, b) { called = true; return parts instanceof Array && parts[0] === "foo" && parts[1] === "bar\n" && parts.raw[0] === "foo" && parts.raw[1] === "bar\\n" && a === 123 && b === 456; } return fn `foo${123}bar\n${456}` && called;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var called = false; function fn(parts, a, b) { called = true; return parts instanceof Array && parts[0] === "foo" && parts[1] === "bar\n" && parts.raw[0] === "foo" && parts.raw[1] === "bar\\n" && a === 123 && b === 456; } return fn `foo${123}bar\n${456}` && called;
}
§passed array is frozen
?
function(){
return (function(parts) { return Object.isFrozen(parts) && Object.isFrozen(parts.raw); }) `foo${0}bar${0}baz`;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return (function(parts) { return Object.isFrozen(parts) && Object.isFrozen(parts.raw); }) `foo${0}bar${0}baz`;
}
§line break normalisation
?
function(){
var cr = eval("`x" + String.fromCharCode(13) + "y`"); var lf = eval("`x" + String.fromCharCode(10) + "y`"); var crlf = eval("`x" + String.fromCharCode(13,10) + "y`"); return cr.length === 3 && lf.length === 3 && crlf.length === 3 && cr[1] === lf[1] && lf[1] === crlf[1] && crlf[1] === '\n';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var cr = eval("`x" + String.fromCharCode(13) + "y`"); var lf = eval("`x" + String.fromCharCode(10) + "y`"); var crlf = eval("`x" + String.fromCharCode(13,10) + "y`"); return cr.length === 3 && lf.length === 3 && crlf.length === 3 && cr[1] === lf[1] && lf[1] === crlf[1] && crlf[1] === '\n';
}
§TemplateStrings call site caching
?
function(){
// TemplateStrings caching was changed from per-contents to // per-call-site. // https://github.com/tc39/ecma262/pull/890 function strings(array) { return array; } function getStrings() { return strings`foo`; } var original = getStrings(); var other = strings`foo`; return original === getStrings() && original !== other;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
Error
Error
function(){
// TemplateStrings caching was changed from per-contents to // per-call-site. // https://github.com/tc39/ecma262/pull/890 function strings(array) { return array; } function getStrings() { return strings`foo`; } var original = getStrings(); var other = strings`foo`; return original === getStrings() && original !== other;
}
§TemplateStrings permanent caching
?
function(){
function strings(array) { return array; } function getStrings() { return strings`foo`; } var original = getStrings(); var newed = new getStrings(); return original === getStrings() && original === newed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
function strings(array) { return array; } function getStrings() { return strings`foo`; } var original = getStrings(); var newed = new getStrings(); return original === getStrings() && original === newed;
}

RegExp "y" and "u" flags

§"y" flag
?
function(){
var re = new RegExp('\\w', 'y'); re.exec('xy'); return (re.exec('xy')[0] === 'y');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var re = new RegExp('\\w', 'y'); re.exec('xy'); return (re.exec('xy')[0] === 'y');
}
§"y" flag, lastIndex
?
function(){
var re = new RegExp('yy', 'y'); re.lastIndex = 3; var result = re.exec('xxxyyxx')[0]; return result === 'yy' && re.lastIndex === 5;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var re = new RegExp('yy', 'y'); re.lastIndex = 3; var result = re.exec('xxxyyxx')[0]; return result === 'yy' && re.lastIndex === 5;
}
§"u" flag
?
function(){
return "𠮷".match(/^.$/u)[0].length === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return "𠮷".match(/^.$/u)[0].length === 2;
}
§"u" flag, non-BMP Unicode characters
?
function(){
return "𠮷x".match(/^.x$/u)[0].length === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return "𠮷x".match(/^.x$/u)[0].length === 3;
}
§"u" flag, Unicode code point escapes
?
function(){
return "𝌆".match(/\u{1d306}/u)[0].length === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return "𝌆".match(/\u{1d306}/u)[0].length === 2;
}
§"u" flag, case folding
?
function(){
return "ſ".match(/S/iu) && "S".match(/ſ/iu);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return "ſ".match(/S/iu) && "S".match(/ſ/iu);
}

destructuring, declarations

§with arrays
?
function(){
var [a, , [b], c] = [5, null, [6]]; return a === 5 && b === 6 && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a, , [b], c] = [5, null, [6]]; return a === 5 && b === 6 && c === void undefined;
}
§with sparse arrays
?
function(){
var [a, , b] = [,,,]; return a === void undefined && b === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a, , b] = [,,,]; return a === void undefined && b === void undefined;
}
§with strings
?
function(){
var [a, b, c] = "ab"; return a === "a" && b === "b" && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a, b, c] = "ab"; return a === "a" && b === "b" && c === void undefined;
}
§with astral plane strings
?
function(){
var [c] = "𠮷𠮶"; return c === "𠮷";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [c] = "𠮷𠮶"; return c === "𠮷";
}
§with generator instances
?
function(){
var [a, b, c] = (function*(){ yield 1; yield 2; }()); return a === 1 && b === 2 && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a, b, c] = (function*(){ yield 1; yield 2; }()); return a === 1 && b === 2 && c === void undefined;
}
§with generic iterables
?
function(){
var [a, b, c] = global.__createIterableObject([1, 2]); return a === 1 && b === 2 && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a, b, c] = global.__createIterableObject([1, 2]); return a === 1 && b === 2 && c === void undefined;
}
§with instances of generic iterables
?
function(){
var [a, b, c] = Object.create(global.__createIterableObject([1, 2])); return a === 1 && b === 2 && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a, b, c] = Object.create(global.__createIterableObject([1, 2])); return a === 1 && b === 2 && c === void undefined;
}
§iterator closing
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); var [a, b] = iter; return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); var [a, b] = iter; return closed;
}
§trailing commas in iterable patterns
?
function(){
var [a,] = [1]; return a === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a,] = [1]; return a === 1;
}
§with objects
?
function(){
var {c, x:d, e} = {c:7, x:8}; return c === 7 && d === 8 && e === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var {c, x:d, e} = {c:7, x:8}; return c === 7 && d === 8 && e === void undefined;
}
§object destructuring with primitives
?
function(){
var {toFixed} = 2; var {slice} = ''; return toFixed === Number.prototype.toFixed && slice === String.prototype.slice;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var {toFixed} = 2; var {slice} = ''; return toFixed === Number.prototype.toFixed && slice === String.prototype.slice;
}
§trailing commas in object patterns
?
function(){
var {a,} = {a:1}; return a === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var {a,} = {a:1}; return a === 1;
}
§throws on null and undefined
?
function(){
try { var {a} = null; return false; } catch(e) { if (!(e instanceof TypeError)) return false; } try { var {b} = void undefined; return false; } catch(e) { if (!(e instanceof TypeError)) return false; } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
try { var {a} = null; return false; } catch(e) { if (!(e instanceof TypeError)) return false; } try { var {b} = void undefined; return false; } catch(e) { if (!(e instanceof TypeError)) return false; } return true;
}
§computed properties
?
function(){
var qux = "corge"; var { [qux]: grault } = { corge: "garply" }; return grault === "garply";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var qux = "corge"; var { [qux]: grault } = { corge: "garply" }; return grault === "garply";
}
§multiples in a single var statement
?
function(){
var [a,b] = [5,6], {c,d} = {c:7,d:8}; return a === 5 && b === 6 && c === 7 && d === 8;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a,b] = [5,6], {c,d} = {c:7,d:8}; return a === 5 && b === 6 && c === 7 && d === 8;
}
§nested
?
function(){
var [e, {x:f, g}] = [9, {x:10}]; var {h, x:[i]} = {h:11, x:[12]}; return e === 9 && f === 10 && g === void undefined && h === 11 && i === 12;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [e, {x:f, g}] = [9, {x:10}]; var {h, x:[i]} = {h:11, x:[12]}; return e === 9 && f === 10 && g === void undefined && h === 11 && i === 12;
}
§in for-in loop heads
?
function(){
for(var [i, j, k] in { qux: 1 }) { return i === "q" && j === "u" && k === "x"; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
for(var [i, j, k] in { qux: 1 }) { return i === "q" && j === "u" && k === "x"; }
}
§in for-of loop heads
?
function(){
for(var [i, j, k] of [[1,2,3]]) { return i === 1 && j === 2 && k === 3; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
for(var [i, j, k] of [[1,2,3]]) { return i === 1 && j === 2 && k === 3; }
}
§in catch heads
?
function(){
try { throw [1,2]; } catch([i,j]) { try { throw { k: 3, l: 4 }; } catch({k, l}) { return i === 1 && j === 2 && k === 3 && l === 4; } }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
try { throw [1,2]; } catch([i,j]) { try { throw { k: 3, l: 4 }; } catch({k, l}) { return i === 1 && j === 2 && k === 3 && l === 4; } }
}
§rest
?
function(){
var [a, ...b] = [3, 4, 5]; var [c, ...d] = [6]; return a === 3 && b instanceof Array && (b + "") === "4,5" && c === 6 && d instanceof Array && d.length === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [a, ...b] = [3, 4, 5]; var [c, ...d] = [6]; return a === 3 && b instanceof Array && (b + "") === "4,5" && c === 6 && d instanceof Array && d.length === 0;
}
§defaults
?
function(){
var {a = 1, b = 0, z:c = 3} = {b:2, z:undefined}; var [d = 0, e = 5, f = 6] = [4,,undefined]; return a === 1 && b === 2 && c === 3 && d === 4 && e === 5 && f === 6;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var {a = 1, b = 0, z:c = 3} = {b:2, z:undefined}; var [d = 0, e = 5, f = 6] = [4,,undefined]; return a === 1 && b === 2 && c === 3 && d === 4 && e === 5 && f === 6;
}
§defaults, let temporal dead zone
?
function(){
var {a, b = 2} = {a:1}; try { eval("let {c = c} = {};"); return false; } catch(e){} try { eval("let {c = d, d} = {d:1};"); return false; } catch(e){} return a === 1 && b === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var {a, b = 2} = {a:1}; try { eval("let {c = c} = {};"); return false; } catch(e){} try { eval("let {c = d, d} = {d:1};"); return false; } catch(e){} return a === 1 && b === 2;
}

destructuring, assignment

§with arrays
?
function(){
var a,b,c; [a, , [b], c] = [5, null, [6]]; return a === 5 && b === 6 && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c; [a, , [b], c] = [5, null, [6]]; return a === 5 && b === 6 && c === void undefined;
}
§with sparse arrays
?
function(){
var a, b; [a, , b] = [,,,]; return a === void undefined && b === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a, b; [a, , b] = [,,,]; return a === void undefined && b === void undefined;
}
§with strings
?
function(){
var a,b,c; [a, b, c] = "ab"; return a === "a" && b === "b" && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c; [a, b, c] = "ab"; return a === "a" && b === "b" && c === void undefined;
}
§with astral plane strings
?
function(){
var c; [c] = "𠮷𠮶"; return c === "𠮷";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var c; [c] = "𠮷𠮶"; return c === "𠮷";
}
§with generator instances
?
function(){
var a,b,c; [a, b, c] = (function*(){ yield 1; yield 2; }()); return a === 1 && b === 2 && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c; [a, b, c] = (function*(){ yield 1; yield 2; }()); return a === 1 && b === 2 && c === void undefined;
}
§with generic iterables
?
function(){
var a,b,c; [a, b, c] = global.__createIterableObject([1, 2]); return a === 1 && b === 2 && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c; [a, b, c] = global.__createIterableObject([1, 2]); return a === 1 && b === 2 && c === void undefined;
}
§with instances of generic iterables
?
function(){
var a,b,c; [a, b, c] = Object.create(global.__createIterableObject([1, 2])); return a === 1 && b === 2 && c === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c; [a, b, c] = Object.create(global.__createIterableObject([1, 2])); return a === 1 && b === 2 && c === void undefined;
}
§iterator closing
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); var a,b; [a, b] = iter; return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); var a,b; [a, b] = iter; return closed;
}
§iterable destructuring expression
?
function(){
var a, b, iterable = [1,2]; return ([a, b] = iterable) === iterable;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a, b, iterable = [1,2]; return ([a, b] = iterable) === iterable;
}
§chained iterable destructuring
?
function(){
var a,b,c,d; [a,b] = [c,d] = [1,2]; return a === 1 && b === 2 && c === 1 && d === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c,d; [a,b] = [c,d] = [1,2]; return a === 1 && b === 2 && c === 1 && d === 2;
}
§trailing commas in iterable patterns
?
function(){
var a; [a,] = [1]; return a === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a; [a,] = [1]; return a === 1;
}
§with objects
?
function(){
var c,d,e; ({c, x:d, e} = {c:7, x:8}); return c === 7 && d === 8 && e === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var c,d,e; ({c, x:d, e} = {c:7, x:8}); return c === 7 && d === 8 && e === void undefined;
}
§object destructuring with primitives
?
function(){
var toFixed, slice; ({toFixed} = 2); ({slice} = ''); return toFixed === Number.prototype.toFixed && slice === String.prototype.slice;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var toFixed, slice; ({toFixed} = 2); ({slice} = ''); return toFixed === Number.prototype.toFixed && slice === String.prototype.slice;
}
§trailing commas in object patterns
?
function(){
var a; ({a,} = {a:1}); return a === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a; ({a,} = {a:1}); return a === 1;
}
§object destructuring expression
?
function(){
var a, b, obj = { a:1, b:2 }; return ({a,b} = obj) === obj;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a, b, obj = { a:1, b:2 }; return ({a,b} = obj) === obj;
}
§parenthesised left-hand-side is a syntax error
?
function(){
var a, b; ({a,b} = {a:1,b:2}); try { eval("({a,b}) = {a:3,b:4};"); } catch(e) { return a === 1 && b === 2; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a, b; ({a,b} = {a:1,b:2}); try { eval("({a,b}) = {a:3,b:4};"); } catch(e) { return a === 1 && b === 2; }
}
§chained object destructuring
?
function(){
var a,b,c,d; ({a,b} = {c,d} = {a:1,b:2,c:3,d:4}); return a === 1 && b === 2 && c === 3 && d === 4;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c,d; ({a,b} = {c,d} = {a:1,b:2,c:3,d:4}); return a === 1 && b === 2 && c === 3 && d === 4;
}
§throws on null and undefined
?
function(){
var a,b; try { ({a} = null); return false; } catch(e) { if (!(e instanceof TypeError)) return false; } try { ({b} = void undefined); return false; } catch(e) { if (!(e instanceof TypeError)) return false; } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b; try { ({a} = null); return false; } catch(e) { if (!(e instanceof TypeError)) return false; } try { ({b} = void undefined); return false; } catch(e) { if (!(e instanceof TypeError)) return false; } return true;
}
§computed properties
?
function(){
var grault, qux = "corge"; ({ [qux]: grault } = { corge: "garply" }); return grault === "garply";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var grault, qux = "corge"; ({ [qux]: grault } = { corge: "garply" }); return grault === "garply";
}
§nested
?
function(){
var e,f,g,h,i; [e, {x:f, g}] = [9, {x:10}]; ({h, x:[i]} = {h:11, x:[12]}); return e === 9 && f === 10 && g === void undefined && h === 11 && i === 12;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var e,f,g,h,i; [e, {x:f, g}] = [9, {x:10}]; ({h, x:[i]} = {h:11, x:[12]}); return e === 9 && f === 10 && g === void undefined && h === 11 && i === 12;
}
§rest
?
function(){
var a,b,c,d; [a, ...b] = [3, 4, 5]; [c, ...d] = [6]; return a === 3 && b instanceof Array && (b + "") === "4,5" && c === 6 && d instanceof Array && d.length === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c,d; [a, ...b] = [3, 4, 5]; [c, ...d] = [6]; return a === 3 && b instanceof Array && (b + "") === "4,5" && c === 6 && d instanceof Array && d.length === 0;
}
§nested rest
?
function(){
var a = [1, 2, 3], first, last; [first, ...[a[2], last]] = a; return first === 1 && last === 3 && (a + "") === "1,2,2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a = [1, 2, 3], first, last; [first, ...[a[2], last]] = a; return first === 1 && last === 3 && (a + "") === "1,2,2";
}
§empty patterns
?
function(){
[] = [1,2]; ({} = {a:1,b:2}); return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
[] = [1,2]; ({} = {a:1,b:2}); return true;
}
§defaults
?
function(){
var a,b,c,d,e,f; ({a = 1, b = 0, z:c = 3} = {b:2, z:undefined}); [d = 0, e = 5, f = 6] = [4,,undefined]; return a === 1 && b === 2 && c === 3 && d === 4 && e === 5 && f === 6;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a,b,c,d,e,f; ({a = 1, b = 0, z:c = 3} = {b:2, z:undefined}); [d = 0, e = 5, f = 6] = [4,,undefined]; return a === 1 && b === 2 && c === 3 && d === 4 && e === 5 && f === 6;
}

destructuring, parameters

§with arrays
?
function(){
return function([a, , [b], c]) { return a === 5 && b === 6 && c === void undefined; }([5, null, [6]]);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([a, , [b], c]) { return a === 5 && b === 6 && c === void undefined; }([5, null, [6]]);
}
§with sparse arrays
?
function(){
return function([a, , b]) { return a === void undefined && b === void undefined; }([,,,]);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([a, , b]) { return a === void undefined && b === void undefined; }([,,,]);
}
§with strings
?
function(){
return function([a, b, c]) { return a === "a" && b === "b" && c === void undefined; }("ab");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([a, b, c]) { return a === "a" && b === "b" && c === void undefined; }("ab");
}
§with astral plane strings
?
function(){
return function([c]) { return c === "𠮷"; }("𠮷𠮶");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([c]) { return c === "𠮷"; }("𠮷𠮶");
}
§with generator instances
?
function(){
return function([a, b, c]) { return a === 1 && b === 2 && c === void undefined; }(function*(){ yield 1; yield 2; }());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([a, b, c]) { return a === 1 && b === 2 && c === void undefined; }(function*(){ yield 1; yield 2; }());
}
§with generic iterables
?
function(){
return function([a, b, c]) { return a === 1 && b === 2 && c === void undefined; }(global.__createIterableObject([1, 2]));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([a, b, c]) { return a === 1 && b === 2 && c === void undefined; }(global.__createIterableObject([1, 2]));
}
§with instances of generic iterables
?
function(){
return function([a, b, c]) { return a === 1 && b === 2 && c === void undefined; }(Object.create(global.__createIterableObject([1, 2])));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([a, b, c]) { return a === 1 && b === 2 && c === void undefined; }(Object.create(global.__createIterableObject([1, 2])));
}
§iterator closing
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); (function([a,b]) {}(iter)); return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); (function([a,b]) {}(iter)); return closed;
}
§trailing commas in iterable patterns
?
function(){
return function([a,]) { return a === 1; }([1]);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([a,]) { return a === 1; }([1]);
}
§with objects
?
function(){
return function({c, x:d, e}) { return c === 7 && d === 8 && e === void undefined; }({c:7, x:8});
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function({c, x:d, e}) { return c === 7 && d === 8 && e === void undefined; }({c:7, x:8});
}
§object destructuring with primitives
?
function(){
return function({toFixed}, {slice}) { return toFixed === Number.prototype.toFixed && slice === String.prototype.slice; }(2,'');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function({toFixed}, {slice}) { return toFixed === Number.prototype.toFixed && slice === String.prototype.slice; }(2,'');
}
§trailing commas in object patterns
?
function(){
return function({a,}) { return a === 1; }({a:1});
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function({a,}) { return a === 1; }({a:1});
}
§throws on null and undefined
?
function(){
try { (function({a}){}(null)); return false; } catch(e) {} try { (function({b}){}(undefined)); return false; } catch(e) {} return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
try { (function({a}){}(null)); return false; } catch(e) {} try { (function({b}){}(undefined)); return false; } catch(e) {} return true;
}
§computed properties
?
function(){
var qux = "corge"; return function({ [qux]: grault }) { return grault === "garply"; }({ corge: "garply" });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var qux = "corge"; return function({ [qux]: grault }) { return grault === "garply"; }({ corge: "garply" });
}
§nested
?
function(){
return function([e, {x:f, g}], {h, x:[i]}) { return e === 9 && f === 10 && g === void undefined && h === 11 && i === 12; }([9, {x:10}],{h:11, x:[12]});
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([e, {x:f, g}], {h, x:[i]}) { return e === 9 && f === 10 && g === void undefined && h === 11 && i === 12; }([9, {x:10}],{h:11, x:[12]});
}
§'arguments' interaction
?
function(){
return (function({a, x:b, y:e}, [c, d]) { return arguments[0].a === 1 && arguments[0].x === 2 && !("y" in arguments[0]) && arguments[1] + '' === "3,4"; }({a:1, x:2}, [3, 4]));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function({a, x:b, y:e}, [c, d]) { return arguments[0].a === 1 && arguments[0].x === 2 && !("y" in arguments[0]) && arguments[1] + '' === "3,4"; }({a:1, x:2}, [3, 4]));
}
§new Function() support
?
function(){
return new Function("{a, x:b, y:e}","[c, d]", "return a === 1 && b === 2 && c === 3 && " + "d === 4 && e === void undefined;" )({a:1, x:2}, [3, 4]);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new Function("{a, x:b, y:e}","[c, d]", "return a === 1 && b === 2 && c === 3 && " + "d === 4 && e === void undefined;" )({a:1, x:2}, [3, 4]);
}
§in parameters, function 'length' property
?
function(){
return function({a, b}, [c, d]){}.length === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function({a, b}, [c, d]){}.length === 2;
}
§rest
?
function(){
return function([a, ...b], [c, ...d]) { return a === 3 && b instanceof Array && (b + "") === "4,5" && c === 6 && d instanceof Array && d.length === 0; }([3, 4, 5], [6]);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([a, ...b], [c, ...d]) { return a === 3 && b instanceof Array && (b + "") === "4,5" && c === 6 && d instanceof Array && d.length === 0; }([3, 4, 5], [6]);
}
§empty patterns
?
function(){
return function ([],{}){ return arguments[0] + '' === "3,4" && arguments[1].x === "foo"; }([3,4],{x:"foo"});
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function ([],{}){ return arguments[0] + '' === "3,4" && arguments[1].x === "foo"; }([3,4],{x:"foo"});
}
§defaults
?
function(){
return (function({a = 1, b = 0, c = 3, x:d = 0, y:e = 5}, [f = 6, g = 0, h = 8]) { return a === 1 && b === 2 && c === 3 && d === 4 && e === 5 && f === 6 && g === 7 && h === 8; }({b:2, c:undefined, x:4},[, 7, undefined]));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function({a = 1, b = 0, c = 3, x:d = 0, y:e = 5}, [f = 6, g = 0, h = 8]) { return a === 1 && b === 2 && c === 3 && d === 4 && e === 5 && f === 6 && g === 7 && h === 8; }({b:2, c:undefined, x:4},[, 7, undefined]));
}
§defaults, separate scope
?
function(){
return (function({a=function(){ return typeof b === 'undefined'; }}){ var b = 1; return a(); }({}));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (function({a=function(){ return typeof b === 'undefined'; }}){ var b = 1; return a(); }({}));
}
§defaults, new Function() support
?
function(){
return new Function("{a = 1, b = 0, c = 3, x:d = 0, y:e = 5}", "return a === 1 && b === 2 && c === 3 && d === 4 && e === 5;" )({b:2, c:undefined, x:4});
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new Function("{a = 1, b = 0, c = 3, x:d = 0, y:e = 5}", "return a === 1 && b === 2 && c === 3 && d === 4 && e === 5;" )({b:2, c:undefined, x:4});
}
§aliased defaults, arrow function
?
function(){
return ((a, {b: x = 0, c: y = 3}) => { return a === 1 && x === 2 && y === 3; })(1, {b: 2});
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return ((a, {b: x = 0, c: y = 3}) => { return a === 1 && x === 2 && y === 3; })(1, {b: 2});
}
§shorthand defaults, arrow function
?
function(){
return ((a, {b = 0, c = 3}) => { return a === 1 && b === 2 && c === 3; })(1, {b: 2});
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return ((a, {b = 0, c = 3}) => { return a === 1 && b === 2 && c === 3; })(1, {b: 2});
}
§duplicate identifier
?
function(){
try { eval('var d = function d([d]) { return d };if (d([true]) !== true) return false;'); } catch (e) { return !(e instanceof SyntaxError); } try { eval('var f = function f([id, id]) { return id }'); return false; } catch (e) { return e instanceof SyntaxError; }
}
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
try { eval('var d = function d([d]) { return d };if (d([true]) !== true) return false;'); } catch (e) { return !(e instanceof SyntaxError); } try { eval('var f = function f([id, id]) { return id }'); return false; } catch (e) { return e instanceof SyntaxError; }
}

Unicode code point escapes

§in strings
?
function(){
return '\u{1d306}' === '\ud834\udf06';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return '\u{1d306}' === '\ud834\udf06';
}
§in identifiers
?
function(){
var \u{102C0} = 2; return \u{102C0} === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var \u{102C0} = 2; return \u{102C0} === 2;
}
§in property key definitions
?
function(){
var o = { \u{102C0} : 2 }; return o['\ud800\udec0'] === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var o = { \u{102C0} : 2 }; return o['\ud800\udec0'] === 2;
}
§in property key accesses
?
function(){
var o = { '\ud800\udec0' : 2 }; return o.\u{102C0} === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var o = { '\ud800\udec0' : 2 }; return o.\u{102C0} === 2;
}

new.target

§in constructors
?
function(){
var passed = false; new function f() { passed = (new.target === f); }(); (function() { passed &= (new.target === void undefined); }()); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new function f() { passed = (new.target === f); }(); (function() { passed &= (new.target === void undefined); }()); return passed;
}
§assignment is an early error
?
function(){
var passed = false; new function f() { passed = (new.target === f); }(); try { Function("new.target = function(){};"); } catch(e) { return passed; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new function f() { passed = (new.target === f); }(); try { Function("new.target = function(){};"); } catch(e) { return passed; }
}

bindings

const

§basic support
?
function(){
const foo = 123; return (foo === 123);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
const foo = 123; return (foo === 123);
}
§is block-scoped
?
function(){
const bar = 123; { const bar = 456; } return bar === 123;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const bar = 123; { const bar = 456; } return bar === 123;
}
§scope shadow resolution
?
function(){
try { { const bar = 456; } const bar = 123; return bar === 123; } catch(e) { return false; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
try { { const bar = 456; } const bar = 123; return bar === 123; } catch(e) { return false; }
}
§cannot be in statements
?
function(){
const bar = 1; try { Function("if(true) const baz = 1;")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
const bar = 1; try { Function("if(true) const baz = 1;")(); } catch(e) { return true; }
}
§redefining a const is an error
?
function(){
const baz = 1; try { Function("const foo = 1; foo = 2;")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
const baz = 1; try { Function("const foo = 1; foo = 2;")(); } catch(e) { return true; }
}
§for loop statement scope
?
function(){
const baz = 1; for(const baz = 0; false;) {} return baz === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const baz = 1; for(const baz = 0; false;) {} return baz === 1;
}
§for-in loop iteration scope
?
function(){
var scopes = []; for(const i in { a:1, b:1 }) { scopes.push(function(){ return i; }); } return (scopes[0]() === "a" && scopes[1]() === "b");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Error
Error
Error
Error
function(){
var scopes = []; for(const i in { a:1, b:1 }) { scopes.push(function(){ return i; }); } return (scopes[0]() === "a" && scopes[1]() === "b");
}
§for-of loop iteration scope
?
function(){
var scopes = []; for(const i of ['a','b']) { scopes.push(function(){ return i; }); } return (scopes[0]() === "a" && scopes[1]() === "b");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Error
Error
Error
Error
function(){
var scopes = []; for(const i of ['a','b']) { scopes.push(function(){ return i; }); } return (scopes[0]() === "a" && scopes[1]() === "b");
}
§temporal dead zone
?
function(){
var passed = (function(){ try { qux; } catch(e) { return true; }}()); function fn() { passed &= qux === 456; } const qux = 456; fn(); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
var passed = (function(){ try { qux; } catch(e) { return true; }}()); function fn() { passed &= qux === 456; } const qux = 456; fn(); return passed;
}
§basic support (strict mode)
?
function(){
"use strict"; const foo = 123; return (foo === 123);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
"use strict"; const foo = 123; return (foo === 123);
}
§is block-scoped (strict mode)
?
function(){
'use strict'; const bar = 123; { const bar = 456; } return bar === 123;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; const bar = 123; { const bar = 456; } return bar === 123;
}
§scope shadow resolution (strict mode)
?
function(){
'use strict'; try { { const bar = 456; } const bar = 123; return bar === 123; } catch(e) { return false; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; try { { const bar = 456; } const bar = 123; return bar === 123; } catch(e) { return false; }
}
§cannot be in statements (strict mode)
?
function(){
'use strict'; const bar = 1; try { Function("'use strict'; if(true) const baz = 1;")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; const bar = 1; try { Function("'use strict'; if(true) const baz = 1;")(); } catch(e) { return true; }
}
§redefining a const (strict mode)
?
function(){
'use strict'; const baz = 1; try { Function("'use strict'; const foo = 1; foo = 2;")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; const baz = 1; try { Function("'use strict'; const foo = 1; foo = 2;")(); } catch(e) { return true; }
}
§for loop statement scope (strict mode)
?
function(){
'use strict'; const baz = 1; for(const baz = 0; false;) {} return baz === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; const baz = 1; for(const baz = 0; false;) {} return baz === 1;
}
§for-in loop iteration scope (strict mode)
?
function(){
'use strict'; var scopes = []; for(const i in { a:1, b:1 }) { scopes.push(function(){ return i; }); } return (scopes[0]() === "a" && scopes[1]() === "b");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
'use strict'; var scopes = []; for(const i in { a:1, b:1 }) { scopes.push(function(){ return i; }); } return (scopes[0]() === "a" && scopes[1]() === "b");
}
§for-of loop iteration scope (strict mode)
?
function(){
'use strict'; var scopes = []; for(const i of ['a','b']) { scopes.push(function(){ return i; }); } return (scopes[0]() === "a" && scopes[1]() === "b");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
'use strict'; var scopes = []; for(const i of ['a','b']) { scopes.push(function(){ return i; }); } return (scopes[0]() === "a" && scopes[1]() === "b");
}
§temporal dead zone (strict mode)
?
function(){
'use strict'; var passed = (function(){ try { qux; } catch(e) { return true; }}()); function fn() { passed &= qux === 456; } const qux = 456; fn(); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; var passed = (function(){ try { qux; } catch(e) { return true; }}()); function fn() { passed &= qux === 456; } const qux = 456; fn(); return passed;
}

let

§basic support
?
function(){
let foo = 123; return (foo === 123);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let foo = 123; return (foo === 123);
}
§is block-scoped
?
function(){
let bar = 123; { let bar = 456; } return bar === 123;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let bar = 123; { let bar = 456; } return bar === 123;
}
§scope shadow resolution
?
function(){
try { { let bar = 456; } let bar = 123; return bar === 123; } catch(e) { return false; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
try { { let bar = 456; } let bar = 123; return bar === 123; } catch(e) { return false; }
}
§cannot be in statements
?
function(){
let bar = 1; try { Function("if(true) let baz = 1;")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let bar = 1; try { Function("if(true) let baz = 1;")(); } catch(e) { return true; }
}
§for loop statement scope
?
function(){
let baz = 1; for(let baz = 0; false;) {} return baz === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let baz = 1; for(let baz = 0; false;) {} return baz === 1;
}
§temporal dead zone
?
function(){
var passed = (function(){ try { qux; } catch(e) { return true; }}()); function fn() { passed &= qux === 456; } let qux = 456; fn(); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = (function(){ try { qux; } catch(e) { return true; }}()); function fn() { passed &= qux === 456; } let qux = 456; fn(); return passed;
}
§for/for-in loop iteration scope
?
function(){
let scopes = []; for(let i = 0; i < 2; i++) { scopes.push(function(){ return i; }); } let passed = (scopes[0]() === 0 && scopes[1]() === 1); scopes = []; for(let i in { a:1, b:1 }) { scopes.push(function(){ return i; }); } passed &= (scopes[0]() === "a" && scopes[1]() === "b"); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let scopes = []; for(let i = 0; i < 2; i++) { scopes.push(function(){ return i; }); } let passed = (scopes[0]() === 0 && scopes[1]() === 1); scopes = []; for(let i in { a:1, b:1 }) { scopes.push(function(){ return i; }); } passed &= (scopes[0]() === "a" && scopes[1]() === "b"); return passed;
}
§for-in loop binding shadowing parameter
?
function(){
try { Function("function f(e) { for (let e in {}) e }"); return true; } catch(e) { return false; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
try { Function("function f(e) { for (let e in {}) e }"); return true; } catch(e) { return false; }
}
§basic support (strict mode)
?
function(){
'use strict'; let foo = 123; return (foo === 123);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; let foo = 123; return (foo === 123);
}
§is block-scoped (strict mode)
?
function(){
'use strict'; let bar = 123; { let bar = 456; } return bar === 123;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; let bar = 123; { let bar = 456; } return bar === 123;
}
§scope shadow resolution (strict mode)
?
function(){
'use strict'; try { { let bar = 456; } let bar = 123; return bar === 123; } catch(e) { return false; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; try { { let bar = 456; } let bar = 123; return bar === 123; } catch(e) { return false; }
}
§cannot be in statements (strict mode)
?
function(){
'use strict'; let bar = 1; try { Function("'use strict'; if(true) let baz = 1;")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; let bar = 1; try { Function("'use strict'; if(true) let baz = 1;")(); } catch(e) { return true; }
}
§for loop statement scope (strict mode)
?
function(){
'use strict'; let baz = 1; for(let baz = 0; false;) {} return baz === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; let baz = 1; for(let baz = 0; false;) {} return baz === 1;
}
§temporal dead zone (strict mode)
?
function(){
'use strict'; var passed = (function(){ try { qux; } catch(e) { return true; }}()); function fn() { passed &= qux === 456; } let qux = 456; fn(); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; var passed = (function(){ try { qux; } catch(e) { return true; }}()); function fn() { passed &= qux === 456; } let qux = 456; fn(); return passed;
}
§for/for-in loop iteration scope (strict mode)
?
function(){
'use strict'; let scopes = []; for(let i = 0; i < 2; i++) { scopes.push(function(){ return i; }); } let passed = (scopes[0]() === 0 && scopes[1]() === 1); scopes = []; for(let i in { a:1, b:1 }) { scopes.push(function(){ return i; }); } passed &= (scopes[0]() === "a" && scopes[1]() === "b"); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
No
function(){
'use strict'; let scopes = []; for(let i = 0; i < 2; i++) { scopes.push(function(){ return i; }); } let passed = (scopes[0]() === 0 && scopes[1]() === 1); scopes = []; for(let i in { a:1, b:1 }) { scopes.push(function(){ return i; }); } passed &= (scopes[0]() === "a" && scopes[1]() === "b"); return passed;
}
§for-in loop binding shadowing parameter (strict mode)
?
function(){
try { Function("'use strict'; function f(e) { for (let e in {}) e }"); return true; } catch(e) { return false; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
function(){
try { Function("'use strict'; function f(e) { for (let e in {}) e }"); return true; } catch(e) { return false; }
}

§block-level function declaration
?
function(){
'use strict'; if (f() !== 1) return false; function f() { return 1; } { if (f() !== 2) return false; function f() { return 2; } if (f() !== 2) return false; } if (f() !== 1) return false; return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
function(){
'use strict'; if (f() !== 1) return false; function f() { return 1; } { if (f() !== 2) return false; function f() { return 2; } if (f() !== 2) return false; } if (f() !== 1) return false; return true;
}

functions

arrow functions

§0 parameters
?
function(){
return (() => 5)() === 5;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
return (() => 5)() === 5;
}
§1 parameter, no brackets
?
function(){
var b = x => x + "foo"; return (b("fee fie foe ") === "fee fie foe foo");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var b = x => x + "foo"; return (b("fee fie foe ") === "fee fie foe foo");
}
§multiple parameters
?
function(){
var c = (v, w, x, y, z) => "" + v + w + x + y + z; return (c(6, 5, 4, 3, 2) === "65432");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var c = (v, w, x, y, z) => "" + v + w + x + y + z; return (c(6, 5, 4, 3, 2) === "65432");
}
§lexical "this" binding
?
function(){
var d = { x : "bar", y : function() { return z => this.x + z; }}.y(); var e = { x : "baz", y : d }; return d("ley") === "barley" && e.y("ley") === "barley";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
function(){
var d = { x : "bar", y : function() { return z => this.x + z; }}.y(); var e = { x : "baz", y : d }; return d("ley") === "barley" && e.y("ley") === "barley";
}
§"this" unchanged by call or apply
?
function(){
var d = { x : "foo", y : function() { return () => this.x; }}; var e = { x : "bar" }; return d.y().call(e) === "foo" && d.y().apply(e) === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
function(){
var d = { x : "foo", y : function() { return () => this.x; }}; var e = { x : "bar" }; return d.y().call(e) === "foo" && d.y().apply(e) === "foo";
}
§can't be bound, can be curried
?
function(){
var d = { x : "bar", y : function() { return z => this.x + z; }}; var e = { x : "baz" }; return d.y().bind(e, "ley")() === "barley";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
function(){
var d = { x : "bar", y : function() { return z => this.x + z; }}; var e = { x : "baz" }; return d.y().bind(e, "ley")() === "barley";
}
§lexical "arguments" binding
?
function(){
var f = (function() { return z => arguments[0]; }(5)); return f(6) === 5;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
function(){
var f = (function() { return z => arguments[0]; }(5)); return f(6) === 5;
}
§no line break between params and =>
?
function(){
return (() => { try { Function("x\n => 2")(); } catch(e) { return true; } })();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
function(){
return (() => { try { Function("x\n => 2")(); } catch(e) { return true; } })();
}
§correct precedence
?
function(){
return (() => { try { Function("0 || () => 2")(); } catch(e) { return true; } })();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Error
No
Error
Error
function(){
return (() => { try { Function("0 || () => 2")(); } catch(e) { return true; } })();
}
§no "prototype" property
?
function(){
var a = () => 5; return !a.hasOwnProperty("prototype");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
function(){
var a = () => 5; return !a.hasOwnProperty("prototype");
}
§lexical "super" binding in constructors
?
function(){
var received; class B { constructor (arg) { received = arg; } } class C extends B { constructor () { var callSuper = () => super('foo'); callSuper(); } } return new C instanceof C && received === 'foo'
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var received; class B { constructor (arg) { received = arg; } } class C extends B { constructor () { var callSuper = () => super('foo'); callSuper(); } } return new C instanceof C && received === 'foo'
}
§lexical "super" binding in methods
?
function(){
class B { qux() { return "quux"; } } class C extends B { baz() { return x => super.qux(); } } var arrow = new C().baz(); return arrow() === "quux";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class B { qux() { return "quux"; } } class C extends B { baz() { return x => super.qux(); } } var arrow = new C().baz(); return arrow() === "quux";
}
§lexical "new.target" binding
?
function(){
function C() { return x => new.target; } return new C()() === C && C()() === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
function(){
function C() { return x => new.target; } return new C()() === C && C()() === void undefined;
}

class

§class statement
?
function(){
class C {} return typeof C === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C {} return typeof C === "function";
}
§is block-scoped
?
function(){
class C {} var c1 = C; { class C {} var c2 = C; } return C === c1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C {} var c1 = C; { class C {} var c2 = C; } return C === c1;
}
§class expression
?
function(){
return typeof class C {} === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
return typeof class C {} === "function";
}
§anonymous class
?
function(){
return typeof class {} === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
return typeof class {} === "function";
}
§constructor
?
function(){
class C { constructor() { this.x = 1; } } return C.prototype.constructor === C && new C().x === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { constructor() { this.x = 1; } } return C.prototype.constructor === C && new C().x === 1;
}
§prototype methods
?
function(){
class C { method() { return 2; } } return typeof C.prototype.method === "function" && new C().method() === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { method() { return 2; } } return typeof C.prototype.method === "function" && new C().method() === 2;
}
§string-keyed methods
?
function(){
class C { "foo bar"() { return 2; } } return typeof C.prototype["foo bar"] === "function" && new C()["foo bar"]() === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { "foo bar"() { return 2; } } return typeof C.prototype["foo bar"] === "function" && new C()["foo bar"]() === 2;
}
§computed prototype methods
?
function(){
var foo = "method"; class C { [foo]() { return 2; } } return typeof C.prototype.method === "function" && new C().method() === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var foo = "method"; class C { [foo]() { return 2; } } return typeof C.prototype.method === "function" && new C().method() === 2;
}
§optional semicolons
?
function(){
class C { ; method() { return 2; }; method2() { return 2; } method3() { return 2; }; } return typeof C.prototype.method === "function" && typeof C.prototype.method2 === "function" && typeof C.prototype.method3 === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { ; method() { return 2; }; method2() { return 2; } method3() { return 2; }; } return typeof C.prototype.method === "function" && typeof C.prototype.method2 === "function" && typeof C.prototype.method3 === "function";
}
§static methods
?
function(){
class C { static method() { return 3; } } return typeof C.method === "function" && C.method() === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { static method() { return 3; } } return typeof C.method === "function" && C.method() === 3;
}
§computed static methods
?
function(){
var foo = "method"; class C { static [foo]() { return 3; } } return typeof C.method === "function" && C.method() === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var foo = "method"; class C { static [foo]() { return 3; } } return typeof C.method === "function" && C.method() === 3;
}
§accessor properties
?
function(){
var baz = false; class C { get foo() { return "foo"; } set bar(x) { baz = x; } } new C().bar = true; return new C().foo === "foo" && baz;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var baz = false; class C { get foo() { return "foo"; } set bar(x) { baz = x; } } new C().bar = true; return new C().foo === "foo" && baz;
}
§computed accessor properties
?
function(){
var garply = "foo", grault = "bar", baz = false; class C { get [garply]() { return "foo"; } set [grault](x) { baz = x; } } new C().bar = true; return new C().foo === "foo" && baz;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var garply = "foo", grault = "bar", baz = false; class C { get [garply]() { return "foo"; } set [grault](x) { baz = x; } } new C().bar = true; return new C().foo === "foo" && baz;
}
§static accessor properties
?
function(){
var baz = false; class C { static get foo() { return "foo"; } static set bar(x) { baz = x; } } C.bar = true; return C.foo === "foo" && baz;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var baz = false; class C { static get foo() { return "foo"; } static set bar(x) { baz = x; } } C.bar = true; return C.foo === "foo" && baz;
}
§computed static accessor properties
?
function(){
var garply = "foo", grault = "bar", baz = false; class C { static get [garply]() { return "foo"; } static set [grault](x) { baz = x; } } C.bar = true; return C.foo === "foo" && baz;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var garply = "foo", grault = "bar", baz = false; class C { static get [garply]() { return "foo"; } static set [grault](x) { baz = x; } } C.bar = true; return C.foo === "foo" && baz;
}
§class name is lexically scoped
?
function(){
class C { method() { return typeof C === "function"; } } var M = C.prototype.method; C = void undefined; return C === void undefined && M();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { method() { return typeof C === "function"; } } var M = C.prototype.method; C = void undefined; return C === void undefined && M();
}
§computed names, temporal dead zone
?
function(){
try { var B = class C { [C](){} } } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
try { var B = class C { [C](){} } } catch(e) { return true; }
}
§methods aren't enumerable
?
function(){
class C { foo() {} static bar() {} } return !C.prototype.propertyIsEnumerable("foo") && !C.propertyIsEnumerable("bar");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { foo() {} static bar() {} } return !C.prototype.propertyIsEnumerable("foo") && !C.propertyIsEnumerable("bar");
}
§implicit strict mode
?
function(){
class C { static method() { return this === void undefined; } } return (0,C.method)();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { static method() { return this === void undefined; } } return (0,C.method)();
}
§constructor requires new
?
function(){
class C {} try { C(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C {} try { C(); } catch(e) { return true; }
}
§extends
?
function(){
class B {} class C extends B {} return new C() instanceof B && B.isPrototypeOf(C);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class B {} class C extends B {} return new C() instanceof B && B.isPrototypeOf(C);
}
§extends expressions
?
function(){
var B; class C extends (B = class {}) {} return new C() instanceof B && B.isPrototypeOf(C);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var B; class C extends (B = class {}) {} return new C() instanceof B && B.isPrototypeOf(C);
}
§extends null
?
function(){
class C extends null { constructor() { return Object.create(null); } } return Function.prototype.isPrototypeOf(C) && Object.getPrototypeOf(C.prototype) === null;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends null { constructor() { return Object.create(null); } } return Function.prototype.isPrototypeOf(C) && Object.getPrototypeOf(C.prototype) === null;
}
§new.target
?
function(){
var passed = false; new function f() { passed = new.target === f; }(); class A { constructor() { passed &= new.target === B; } } class B extends A {} new B(); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new function f() { passed = new.target === f; }(); class A { constructor() { passed &= new.target === B; } } class B extends A {} new B(); return passed;
}

super

§statement in constructors
?
function(){
var passed = false; class B { constructor(a) { passed = (a === "barbaz"); } } class C extends B { constructor(a) { super("bar" + a); } } new C("baz"); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var passed = false; class B { constructor(a) { passed = (a === "barbaz"); } } class C extends B { constructor(a) { super("bar" + a); } } new C("baz"); return passed;
}
§expression in constructors
?
function(){
class B { constructor(a) { return ["foo" + a]; } } class C extends B { constructor(a) { return super("bar" + a); } } return new C("baz")[0] === "foobarbaz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class B { constructor(a) { return ["foo" + a]; } } class C extends B { constructor(a) { return super("bar" + a); } } return new C("baz")[0] === "foobarbaz";
}
§in methods, property access
?
function(){
class B {} B.prototype.qux = "foo"; B.prototype.corge = "baz"; class C extends B { quux(a) { return super.qux + a + super["corge"]; } } C.prototype.qux = "garply"; return new C().quux("bar") === "foobarbaz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class B {} B.prototype.qux = "foo"; B.prototype.corge = "baz"; class C extends B { quux(a) { return super.qux + a + super["corge"]; } } C.prototype.qux = "garply"; return new C().quux("bar") === "foobarbaz";
}
§in methods, method calls
?
function(){
class B { qux(a) { return "foo" + a; } } class C extends B { qux(a) { return super.qux("bar" + a); } } return new C().qux("baz") === "foobarbaz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class B { qux(a) { return "foo" + a; } } class C extends B { qux(a) { return super.qux("bar" + a); } } return new C().qux("baz") === "foobarbaz";
}
§method calls use correct "this" binding
?
function(){
class B { qux(a) { return this.foo + a; } } class C extends B { qux(a) { return super.qux("bar" + a); } } var obj = new C(); obj.foo = "foo"; return obj.qux("baz") === "foobarbaz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class B { qux(a) { return this.foo + a; } } class C extends B { qux(a) { return super.qux("bar" + a); } } var obj = new C(); obj.foo = "foo"; return obj.qux("baz") === "foobarbaz";
}
§constructor calls use correct "new.target" binding
?
function(){
var passed; class B { constructor() { passed = (new.target === C); } } class C extends B { constructor() { super(); } } new C(); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var passed; class B { constructor() { passed = (new.target === C); } } class C extends B { constructor() { super(); } } new C(); return passed;
}
§is statically bound
?
function(){
class B { qux() { return "bar"; } } class C extends B { qux() { return super.qux() + this.corge; } } var obj = { qux: C.prototype.qux, corge: "ley" }; return obj.qux() === "barley";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class B { qux() { return "bar"; } } class C extends B { qux() { return super.qux() + this.corge; } } var obj = { qux: C.prototype.qux, corge: "ley" }; return obj.qux() === "barley";
}
§super() invokes the correct constructor
?
function(){
// checks that super() is *not* a synonym of super.constructor() var passed; class B { constructor() { passed = true; } }; B.prototype.constructor = function () { passed = false; }; class C extends B { }; new C; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
// checks that super() is *not* a synonym of super.constructor() var passed; class B { constructor() { passed = true; } }; B.prototype.constructor = function () { passed = false; }; class C extends B { }; new C; return passed;
}

generators

§basic functionality
?
function(){
function * generator(){ yield 5; yield 6; }; var iterator = generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
function * generator(){ yield 5; yield 6; }; var iterator = generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§generator function expressions
?
function(){
var generator = function * (){ yield 5; yield 6; }; var iterator = generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var generator = function * (){ yield 5; yield 6; }; var iterator = generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§correct "this" binding
?
function(){
function * generator(){ yield this.x; yield this.y; }; var iterator = { g: generator, x: 5, y: 6 }.g(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
function * generator(){ yield this.x; yield this.y; }; var iterator = { g: generator, x: 5, y: 6 }.g(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§can't use "this" with new
?
function(){
function * generator(){ yield this.x; yield this.y; }; try { (new generator()).next(); } catch (e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Error
No
Error
Error
function(){
function * generator(){ yield this.x; yield this.y; }; try { (new generator()).next(); } catch (e) { return true; }
}
§sending
?
function(){
var sent; function * generator(){ sent = [yield 5, yield 6]; }; var iterator = generator(); iterator.next(); iterator.next("foo"); iterator.next("bar"); return sent[0] === "foo" && sent[1] === "bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var sent; function * generator(){ sent = [yield 5, yield 6]; }; var iterator = generator(); iterator.next(); iterator.next("foo"); iterator.next("bar"); return sent[0] === "foo" && sent[1] === "bar";
}
§%GeneratorPrototype%
?
function(){
function * generatorFn(){} var ownProto = Object.getPrototypeOf(generatorFn()); var passed = ownProto === generatorFn.prototype; var sharedProto = Object.getPrototypeOf(ownProto); passed &= sharedProto !== Object.prototype && sharedProto === Object.getPrototypeOf(function*(){}.prototype) && sharedProto.hasOwnProperty('next'); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
function * generatorFn(){} var ownProto = Object.getPrototypeOf(generatorFn()); var passed = ownProto === generatorFn.prototype; var sharedProto = Object.getPrototypeOf(ownProto); passed &= sharedProto !== Object.prototype && sharedProto === Object.getPrototypeOf(function*(){}.prototype) && sharedProto.hasOwnProperty('next'); return passed;
}
§%GeneratorPrototype% prototype chain
?
function(){
function * generatorFn(){} var g = generatorFn(); var ownProto = Object.getPrototypeOf(g); var passed = ownProto === generatorFn.prototype; var sharedProto = Object.getPrototypeOf(ownProto); var iterProto = Object.getPrototypeOf(sharedProto); passed &= iterProto.hasOwnProperty(Symbol.iterator) && !sharedProto .hasOwnProperty(Symbol.iterator) && !ownProto .hasOwnProperty(Symbol.iterator) && g[Symbol.iterator]() === g; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
function(){
function * generatorFn(){} var g = generatorFn(); var ownProto = Object.getPrototypeOf(g); var passed = ownProto === generatorFn.prototype; var sharedProto = Object.getPrototypeOf(ownProto); var iterProto = Object.getPrototypeOf(sharedProto); passed &= iterProto.hasOwnProperty(Symbol.iterator) && !sharedProto .hasOwnProperty(Symbol.iterator) && !ownProto .hasOwnProperty(Symbol.iterator) && g[Symbol.iterator]() === g; return passed;
}
§%GeneratorPrototype%.constructor
?
function(){
function * g (){} var iterator = new g.constructor("a","b","c","yield a; yield b; yield c;")(5,6,7); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === 7 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; passed &= g.constructor === (function*(){}).constructor; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
function * g (){} var iterator = new g.constructor("a","b","c","yield a; yield b; yield c;")(5,6,7); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === 7 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; passed &= g.constructor === (function*(){}).constructor; return passed;
}
§%GeneratorPrototype%.throw
?
function(){
var passed = false; function * generator(){ try { yield 5; yield 6; } catch(e) { passed = (e === "foo"); } }; var iterator = generator(); iterator.next(); iterator.throw("foo"); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var passed = false; function * generator(){ try { yield 5; yield 6; } catch(e) { passed = (e === "foo"); } }; var iterator = generator(); iterator.next(); iterator.throw("foo"); return passed;
}
§%GeneratorPrototype%.return
?
function(){
function * generator(){ yield 5; yield 6; }; var iterator = generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.return("quxquux"); passed &= item.value === "quxquux" && item.done === true; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function * generator(){ yield 5; yield 6; }; var iterator = generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.return("quxquux"); passed &= item.value === "quxquux" && item.done === true; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§yield operator precedence
?
function(){
var passed; function * generator(){ passed = yield 0 ? true : false; }; var iterator = generator(); iterator.next(); iterator.next(true); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var passed; function * generator(){ passed = yield 0 ? true : false; }; var iterator = generator(); iterator.next(); iterator.next(true); return passed;
}
§yield *, arrays
?
function(){
var iterator = (function * generator() { yield * [5, 6]; }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var iterator = (function * generator() { yield * [5, 6]; }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§yield *, sparse arrays
?
function(){
var iterator = (function * generator() { yield * [,,]; }()); var item = iterator.next(); var passed = item.value === void undefined && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var iterator = (function * generator() { yield * [,,]; }()); var item = iterator.next(); var passed = item.value === void undefined && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§yield *, strings
?
function(){
var iterator = (function * generator() { yield * "56"; }()); var item = iterator.next(); var passed = item.value === "5" && item.done === false; item = iterator.next(); passed &= item.value === "6" && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var iterator = (function * generator() { yield * "56"; }()); var item = iterator.next(); var passed = item.value === "5" && item.done === false; item = iterator.next(); passed &= item.value === "6" && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§yield *, astral plane strings
?
function(){
var iterator = (function * generator() { yield * "𠮷𠮶"; }()); var item = iterator.next(); var passed = item.value === "𠮷" && item.done === false; item = iterator.next(); passed &= item.value === "𠮶" && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var iterator = (function * generator() { yield * "𠮷𠮶"; }()); var item = iterator.next(); var passed = item.value === "𠮷" && item.done === false; item = iterator.next(); passed &= item.value === "𠮶" && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§yield *, generator instances
?
function(){
var iterator = (function * generator() { yield * (function*(){ yield 5; yield 6; yield 7; }()); }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === 7 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var iterator = (function * generator() { yield * (function*(){ yield 5; yield 6; yield 7; }()); }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === 7 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§yield *, generic iterables
?
function(){
var iterator = (function * generator() { yield * global.__createIterableObject([5, 6, 7]); }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === 7 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var iterator = (function * generator() { yield * global.__createIterableObject([5, 6, 7]); }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === 7 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§yield *, instances of iterables
?
function(){
var iterator = (function * generator() { yield * Object.create(__createIterableObject([5, 6, 7])); }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === 7 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var iterator = (function * generator() { yield * Object.create(__createIterableObject([5, 6, 7])); }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === 7 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§yield * on non-iterables is a runtime error
?
function(){
var iterator = (function * generator() { yield * [5]; }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; iterator = (function * generator() { yield * 5; }()); try { iterator.next(); } catch (e) { return passed; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var iterator = (function * generator() { yield * [5]; }()); var item = iterator.next(); var passed = item.value === 5 && item.done === false; iterator = (function * generator() { yield * 5; }()); try { iterator.next(); } catch (e) { return passed; }
}
§yield *, iterator closing
?
function(){
var closed = ''; var iter = __createIterableObject([1, 2, 3], { 'return': function(){ closed += 'a'; return {done: true}; } }); var gen = (function* generator(){ try { yield *iter; } finally { closed += 'b'; } })(); gen.next(); gen['return'](); return closed === 'ab';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var closed = ''; var iter = __createIterableObject([1, 2, 3], { 'return': function(){ closed += 'a'; return {done: true}; } }); var gen = (function* generator(){ try { yield *iter; } finally { closed += 'b'; } })(); gen.next(); gen['return'](); return closed === 'ab';
}
§yield *, iterator closing via throw()
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'throw': undefined, 'return': function() { closed = true; return {done: true}; } }); var gen = (function*(){ try { yield *iter; } catch(e){} })(); gen.next(); gen['throw'](); return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Error
No
Error
Error
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'throw': undefined, 'return': function() { closed = true; return {done: true}; } }); var gen = (function*(){ try { yield *iter; } catch(e){} })(); gen.next(); gen['throw'](); return closed;
}
§shorthand generator methods
?
function(){
var o = { * generator() { yield 5; yield 6; } }; var iterator = o.generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var o = { * generator() { yield 5; yield 6; } }; var iterator = o.generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§string-keyed shorthand generator methods
?
function(){
var o = { * "foo bar"() { yield 5; yield 6; } }; var iterator = o["foo bar"](); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var o = { * "foo bar"() { yield 5; yield 6; } }; var iterator = o["foo bar"](); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§computed shorthand generators
?
function(){
var garply = "generator"; var o = { * [garply] () { yield 5; yield 6; } }; var iterator = o.generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var garply = "generator"; var o = { * [garply] () { yield 5; yield 6; } }; var iterator = o.generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§shorthand generator methods, classes
?
function(){
class C { * generator() { yield 5; yield 6; } }; var iterator = new C().generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { * generator() { yield 5; yield 6; } }; var iterator = new C().generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§computed shorthand generators, classes
?
function(){
var garply = "generator"; class C { * [garply] () { yield 5; yield 6; } } var iterator = new C().generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var garply = "generator"; class C { * [garply] () { yield 5; yield 6; } } var iterator = new C().generator(); var item = iterator.next(); var passed = item.value === 5 && item.done === false; item = iterator.next(); passed &= item.value === 6 && item.done === false; item = iterator.next(); passed &= item.value === void undefined && item.done === true; return passed;
}
§shorthand generators can't be constructors
?
function(){
class C { * generator() { yield 5; yield 6; } }; try { Function("class D { * constructor() { return {}; } }"); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { * generator() { yield 5; yield 6; } }; try { Function("class D { * constructor() { return {}; } }"); } catch(e) { return true; }
}

built-ins

typed arrays

§Int8Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new Int8Array(buffer); view[0] = 0x80; return view[0] === -0x80;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Int8Array(buffer); view[0] = 0x80; return view[0] === -0x80;
}
§Uint8Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new Uint8Array(buffer); view[0] = 0x100; return view[0] === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Uint8Array(buffer); view[0] = 0x100; return view[0] === 0;
}
§Uint8ClampedArray
?
function(){
var buffer = new ArrayBuffer(64); var view = new Uint8ClampedArray(buffer); view[0] = 0x100; return view[0] === 0xFF;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Uint8ClampedArray(buffer); view[0] = 0x100; return view[0] === 0xFF;
}
§Int16Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new Int16Array(buffer); view[0] = 0x8000; return view[0] === -0x8000;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Int16Array(buffer); view[0] = 0x8000; return view[0] === -0x8000;
}
§Uint16Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new Uint16Array(buffer); view[0] = 0x10000; return view[0] === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Uint16Array(buffer); view[0] = 0x10000; return view[0] === 0;
}
§Int32Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new Int32Array(buffer); view[0] = 0x80000000; return view[0] === -0x80000000;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Int32Array(buffer); view[0] = 0x80000000; return view[0] === -0x80000000;
}
§Uint32Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new Uint32Array(buffer); view[0] = 0x100000000; return view[0] === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Uint32Array(buffer); view[0] = 0x100000000; return view[0] === 0;
}
§Float32Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new Float32Array(buffer); view[0] = 0.1; return view[0] === 0.10000000149011612;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Float32Array(buffer); view[0] = 0.1; return view[0] === 0.10000000149011612;
}
§Float64Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new Float64Array(buffer); view[0] = 0.1; return view[0] === 0.1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new Float64Array(buffer); view[0] = 0.1; return view[0] === 0.1;
}
§DataView (Int8)
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setInt8 (0, 0x80); return view.getInt8(0) === -0x80;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setInt8 (0, 0x80); return view.getInt8(0) === -0x80;
}
§DataView (Uint8)
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setUint8(0, 0x100); return view.getUint8(0) === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setUint8(0, 0x100); return view.getUint8(0) === 0;
}
§DataView (Int16)
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setInt16(0, 0x8000); return view.getInt16(0) === -0x8000;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setInt16(0, 0x8000); return view.getInt16(0) === -0x8000;
}
§DataView (Uint16)
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setUint16(0, 0x10000); return view.getUint16(0) === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setUint16(0, 0x10000); return view.getUint16(0) === 0;
}
§DataView (Int32)
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setInt32(0, 0x80000000); return view.getInt32(0) === -0x80000000;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setInt32(0, 0x80000000); return view.getInt32(0) === -0x80000000;
}
§DataView (Uint32)
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setUint32(0, 0x100000000); return view.getUint32(0) === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setUint32(0, 0x100000000); return view.getUint32(0) === 0;
}
§DataView (Float32)
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setFloat32(0, 0.1); return view.getFloat32(0) === 0.10000000149011612;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setFloat32(0, 0.1); return view.getFloat32(0) === 0.10000000149011612;
}
§DataView (Float64)
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setFloat64(0, 0.1); return view.getFloat64(0) === 0.1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setFloat64(0, 0.1); return view.getFloat64(0) === 0.1;
}
§ArrayBuffer[Symbol.species]
?
function(){
return typeof ArrayBuffer[Symbol.species] === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
return typeof ArrayBuffer[Symbol.species] === 'function';
}
§constructors require new
?
function(){
var buffer = new ArrayBuffer(64); var constructors = [ 'ArrayBuffer', 'DataView', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array' ]; return constructors.every(function (constructor) { try { if (constructor in global) { global[constructor](constructor === "ArrayBuffer" ? 64 : buffer); } return false; } catch(e) { return true; } });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
var buffer = new ArrayBuffer(64); var constructors = [ 'ArrayBuffer', 'DataView', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array' ]; return constructors.every(function (constructor) { try { if (constructor in global) { global[constructor](constructor === "ArrayBuffer" ? 64 : buffer); } return false; } catch(e) { return true; } });
}
§constructors accept generic iterables
?
function(){
var constructors = [ 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array' ]; for(var i = 0; i < constructors.length; i++){ var arr = new global[constructors[i]](__createIterableObject([1, 2, 3])); if(arr.length !== 3 || arr[0] !== 1 || arr[1] !== 2 || arr[2] !== 3)return false; } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
var constructors = [ 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array' ]; for(var i = 0; i < constructors.length; i++){ var arr = new global[constructors[i]](__createIterableObject([1, 2, 3])); if(arr.length !== 3 || arr[0] !== 1 || arr[1] !== 2 || arr[2] !== 3)return false; } return true;
}
§correct prototype chains
?
function(){
var constructors = [ 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array' ]; var constructor = Object.getPrototypeOf(Int8Array); var prototype = Object.getPrototypeOf(Int8Array.prototype); if(constructor === Function.prototype || prototype === Object.prototype)return false; for(var i = 0; i < constructors.length; i+=1) { if (!(constructors[i] in global && Object.getPrototypeOf(global[constructors[i]]) === constructor && Object.getPrototypeOf(global[constructors[i]].prototype) === prototype && Object.getOwnPropertyNames(global[constructors[i]].prototype).sort() + '' === "BYTES_PER_ELEMENT,constructor")) { return false; } } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
function(){
var constructors = [ 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array' ]; var constructor = Object.getPrototypeOf(Int8Array); var prototype = Object.getPrototypeOf(Int8Array.prototype); if(constructor === Function.prototype || prototype === Object.prototype)return false; for(var i = 0; i < constructors.length; i+=1) { if (!(constructors[i] in global && Object.getPrototypeOf(global[constructors[i]]) === constructor && Object.getPrototypeOf(global[constructors[i]].prototype) === prototype && Object.getOwnPropertyNames(global[constructors[i]].prototype).sort() + '' === "BYTES_PER_ELEMENT,constructor")) { return false; } } return true;
}
§%TypedArray%.from
?
function(){
return typeof Int8Array.from === "function" && typeof Uint8Array.from === "function" && typeof Uint8ClampedArray.from === "function" && typeof Int16Array.from === "function" && typeof Uint16Array.from === "function" && typeof Int32Array.from === "function" && typeof Uint32Array.from === "function" && typeof Float32Array.from === "function" && typeof Float64Array.from === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.from === "function" && typeof Uint8Array.from === "function" && typeof Uint8ClampedArray.from === "function" && typeof Int16Array.from === "function" && typeof Uint16Array.from === "function" && typeof Int32Array.from === "function" && typeof Uint32Array.from === "function" && typeof Float32Array.from === "function" && typeof Float64Array.from === "function";
}
§%TypedArray%.of
?
function(){
return typeof Int8Array.of === "function" && typeof Uint8Array.of === "function" && typeof Uint8ClampedArray.of === "function" && typeof Int16Array.of === "function" && typeof Uint16Array.of === "function" && typeof Int32Array.of === "function" && typeof Uint32Array.of === "function" && typeof Float32Array.of === "function" && typeof Float64Array.of === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.of === "function" && typeof Uint8Array.of === "function" && typeof Uint8ClampedArray.of === "function" && typeof Int16Array.of === "function" && typeof Uint16Array.of === "function" && typeof Int32Array.of === "function" && typeof Uint32Array.of === "function" && typeof Float32Array.of === "function" && typeof Float64Array.of === "function";
}
§%TypedArray%.prototype.subarray
?
function(){
return typeof Int8Array.prototype.subarray === "function" && typeof Uint8Array.prototype.subarray === "function" && typeof Uint8ClampedArray.prototype.subarray === "function" && typeof Int16Array.prototype.subarray === "function" && typeof Uint16Array.prototype.subarray === "function" && typeof Int32Array.prototype.subarray === "function" && typeof Uint32Array.prototype.subarray === "function" && typeof Float32Array.prototype.subarray === "function" && typeof Float64Array.prototype.subarray === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Int8Array.prototype.subarray === "function" && typeof Uint8Array.prototype.subarray === "function" && typeof Uint8ClampedArray.prototype.subarray === "function" && typeof Int16Array.prototype.subarray === "function" && typeof Uint16Array.prototype.subarray === "function" && typeof Int32Array.prototype.subarray === "function" && typeof Uint32Array.prototype.subarray === "function" && typeof Float32Array.prototype.subarray === "function" && typeof Float64Array.prototype.subarray === "function";
}
§%TypedArray%.prototype.join
?
function(){
return typeof Int8Array.prototype.join === "function" && typeof Uint8Array.prototype.join === "function" && typeof Uint8ClampedArray.prototype.join === "function" && typeof Int16Array.prototype.join === "function" && typeof Uint16Array.prototype.join === "function" && typeof Int32Array.prototype.join === "function" && typeof Uint32Array.prototype.join === "function" && typeof Float32Array.prototype.join === "function" && typeof Float64Array.prototype.join === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.join === "function" && typeof Uint8Array.prototype.join === "function" && typeof Uint8ClampedArray.prototype.join === "function" && typeof Int16Array.prototype.join === "function" && typeof Uint16Array.prototype.join === "function" && typeof Int32Array.prototype.join === "function" && typeof Uint32Array.prototype.join === "function" && typeof Float32Array.prototype.join === "function" && typeof Float64Array.prototype.join === "function";
}
§%TypedArray%.prototype.indexOf
?
function(){
return typeof Int8Array.prototype.indexOf === "function" && typeof Uint8Array.prototype.indexOf === "function" && typeof Uint8ClampedArray.prototype.indexOf === "function" && typeof Int16Array.prototype.indexOf === "function" && typeof Uint16Array.prototype.indexOf === "function" && typeof Int32Array.prototype.indexOf === "function" && typeof Uint32Array.prototype.indexOf === "function" && typeof Float32Array.prototype.indexOf === "function" && typeof Float64Array.prototype.indexOf === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.indexOf === "function" && typeof Uint8Array.prototype.indexOf === "function" && typeof Uint8ClampedArray.prototype.indexOf === "function" && typeof Int16Array.prototype.indexOf === "function" && typeof Uint16Array.prototype.indexOf === "function" && typeof Int32Array.prototype.indexOf === "function" && typeof Uint32Array.prototype.indexOf === "function" && typeof Float32Array.prototype.indexOf === "function" && typeof Float64Array.prototype.indexOf === "function";
}
§%TypedArray%.prototype.lastIndexOf
?
function(){
return typeof Int8Array.prototype.lastIndexOf === "function" && typeof Uint8Array.prototype.lastIndexOf === "function" && typeof Uint8ClampedArray.prototype.lastIndexOf === "function" && typeof Int16Array.prototype.lastIndexOf === "function" && typeof Uint16Array.prototype.lastIndexOf === "function" && typeof Int32Array.prototype.lastIndexOf === "function" && typeof Uint32Array.prototype.lastIndexOf === "function" && typeof Float32Array.prototype.lastIndexOf === "function" && typeof Float64Array.prototype.lastIndexOf === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.lastIndexOf === "function" && typeof Uint8Array.prototype.lastIndexOf === "function" && typeof Uint8ClampedArray.prototype.lastIndexOf === "function" && typeof Int16Array.prototype.lastIndexOf === "function" && typeof Uint16Array.prototype.lastIndexOf === "function" && typeof Int32Array.prototype.lastIndexOf === "function" && typeof Uint32Array.prototype.lastIndexOf === "function" && typeof Float32Array.prototype.lastIndexOf === "function" && typeof Float64Array.prototype.lastIndexOf === "function";
}
§%TypedArray%.prototype.slice
?
function(){
return typeof Int8Array.prototype.slice === "function" && typeof Uint8Array.prototype.slice === "function" && typeof Uint8ClampedArray.prototype.slice === "function" && typeof Int16Array.prototype.slice === "function" && typeof Uint16Array.prototype.slice === "function" && typeof Int32Array.prototype.slice === "function" && typeof Uint32Array.prototype.slice === "function" && typeof Float32Array.prototype.slice === "function" && typeof Float64Array.prototype.slice === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.slice === "function" && typeof Uint8Array.prototype.slice === "function" && typeof Uint8ClampedArray.prototype.slice === "function" && typeof Int16Array.prototype.slice === "function" && typeof Uint16Array.prototype.slice === "function" && typeof Int32Array.prototype.slice === "function" && typeof Uint32Array.prototype.slice === "function" && typeof Float32Array.prototype.slice === "function" && typeof Float64Array.prototype.slice === "function";
}
§%TypedArray%.prototype.every
?
function(){
return typeof Int8Array.prototype.every === "function" && typeof Uint8Array.prototype.every === "function" && typeof Uint8ClampedArray.prototype.every === "function" && typeof Int16Array.prototype.every === "function" && typeof Uint16Array.prototype.every === "function" && typeof Int32Array.prototype.every === "function" && typeof Uint32Array.prototype.every === "function" && typeof Float32Array.prototype.every === "function" && typeof Float64Array.prototype.every === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.every === "function" && typeof Uint8Array.prototype.every === "function" && typeof Uint8ClampedArray.prototype.every === "function" && typeof Int16Array.prototype.every === "function" && typeof Uint16Array.prototype.every === "function" && typeof Int32Array.prototype.every === "function" && typeof Uint32Array.prototype.every === "function" && typeof Float32Array.prototype.every === "function" && typeof Float64Array.prototype.every === "function";
}
§%TypedArray%.prototype.filter
?
function(){
return typeof Int8Array.prototype.filter === "function" && typeof Uint8Array.prototype.filter === "function" && typeof Uint8ClampedArray.prototype.filter === "function" && typeof Int16Array.prototype.filter === "function" && typeof Uint16Array.prototype.filter === "function" && typeof Int32Array.prototype.filter === "function" && typeof Uint32Array.prototype.filter === "function" && typeof Float32Array.prototype.filter === "function" && typeof Float64Array.prototype.filter === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.filter === "function" && typeof Uint8Array.prototype.filter === "function" && typeof Uint8ClampedArray.prototype.filter === "function" && typeof Int16Array.prototype.filter === "function" && typeof Uint16Array.prototype.filter === "function" && typeof Int32Array.prototype.filter === "function" && typeof Uint32Array.prototype.filter === "function" && typeof Float32Array.prototype.filter === "function" && typeof Float64Array.prototype.filter === "function";
}
§%TypedArray%.prototype.forEach
?
function(){
return typeof Int8Array.prototype.forEach === "function" && typeof Uint8Array.prototype.forEach === "function" && typeof Uint8ClampedArray.prototype.forEach === "function" && typeof Int16Array.prototype.forEach === "function" && typeof Uint16Array.prototype.forEach === "function" && typeof Int32Array.prototype.forEach === "function" && typeof Uint32Array.prototype.forEach === "function" && typeof Float32Array.prototype.forEach === "function" && typeof Float64Array.prototype.forEach === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.forEach === "function" && typeof Uint8Array.prototype.forEach === "function" && typeof Uint8ClampedArray.prototype.forEach === "function" && typeof Int16Array.prototype.forEach === "function" && typeof Uint16Array.prototype.forEach === "function" && typeof Int32Array.prototype.forEach === "function" && typeof Uint32Array.prototype.forEach === "function" && typeof Float32Array.prototype.forEach === "function" && typeof Float64Array.prototype.forEach === "function";
}
§%TypedArray%.prototype.map
?
function(){
return typeof Int8Array.prototype.map === "function" && typeof Uint8Array.prototype.map === "function" && typeof Uint8ClampedArray.prototype.map === "function" && typeof Int16Array.prototype.map === "function" && typeof Uint16Array.prototype.map === "function" && typeof Int32Array.prototype.map === "function" && typeof Uint32Array.prototype.map === "function" && typeof Float32Array.prototype.map === "function" && typeof Float64Array.prototype.map === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.map === "function" && typeof Uint8Array.prototype.map === "function" && typeof Uint8ClampedArray.prototype.map === "function" && typeof Int16Array.prototype.map === "function" && typeof Uint16Array.prototype.map === "function" && typeof Int32Array.prototype.map === "function" && typeof Uint32Array.prototype.map === "function" && typeof Float32Array.prototype.map === "function" && typeof Float64Array.prototype.map === "function";
}
§%TypedArray%.prototype.reduce
?
function(){
return typeof Int8Array.prototype.reduce === "function" && typeof Uint8Array.prototype.reduce === "function" && typeof Uint8ClampedArray.prototype.reduce === "function" && typeof Int16Array.prototype.reduce === "function" && typeof Uint16Array.prototype.reduce === "function" && typeof Int32Array.prototype.reduce === "function" && typeof Uint32Array.prototype.reduce === "function" && typeof Float32Array.prototype.reduce === "function" && typeof Float64Array.prototype.reduce === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.reduce === "function" && typeof Uint8Array.prototype.reduce === "function" && typeof Uint8ClampedArray.prototype.reduce === "function" && typeof Int16Array.prototype.reduce === "function" && typeof Uint16Array.prototype.reduce === "function" && typeof Int32Array.prototype.reduce === "function" && typeof Uint32Array.prototype.reduce === "function" && typeof Float32Array.prototype.reduce === "function" && typeof Float64Array.prototype.reduce === "function";
}
§%TypedArray%.prototype.reduceRight
?
function(){
return typeof Int8Array.prototype.reduceRight === "function" && typeof Uint8Array.prototype.reduceRight === "function" && typeof Uint8ClampedArray.prototype.reduceRight === "function" && typeof Int16Array.prototype.reduceRight === "function" && typeof Uint16Array.prototype.reduceRight === "function" && typeof Int32Array.prototype.reduceRight === "function" && typeof Uint32Array.prototype.reduceRight === "function" && typeof Float32Array.prototype.reduceRight === "function" && typeof Float64Array.prototype.reduceRight === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.reduceRight === "function" && typeof Uint8Array.prototype.reduceRight === "function" && typeof Uint8ClampedArray.prototype.reduceRight === "function" && typeof Int16Array.prototype.reduceRight === "function" && typeof Uint16Array.prototype.reduceRight === "function" && typeof Int32Array.prototype.reduceRight === "function" && typeof Uint32Array.prototype.reduceRight === "function" && typeof Float32Array.prototype.reduceRight === "function" && typeof Float64Array.prototype.reduceRight === "function";
}
§%TypedArray%.prototype.reverse
?
function(){
return typeof Int8Array.prototype.reverse === "function" && typeof Uint8Array.prototype.reverse === "function" && typeof Uint8ClampedArray.prototype.reverse === "function" && typeof Int16Array.prototype.reverse === "function" && typeof Uint16Array.prototype.reverse === "function" && typeof Int32Array.prototype.reverse === "function" && typeof Uint32Array.prototype.reverse === "function" && typeof Float32Array.prototype.reverse === "function" && typeof Float64Array.prototype.reverse === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.reverse === "function" && typeof Uint8Array.prototype.reverse === "function" && typeof Uint8ClampedArray.prototype.reverse === "function" && typeof Int16Array.prototype.reverse === "function" && typeof Uint16Array.prototype.reverse === "function" && typeof Int32Array.prototype.reverse === "function" && typeof Uint32Array.prototype.reverse === "function" && typeof Float32Array.prototype.reverse === "function" && typeof Float64Array.prototype.reverse === "function";
}
§%TypedArray%.prototype.some
?
function(){
return typeof Int8Array.prototype.some === "function" && typeof Uint8Array.prototype.some === "function" && typeof Uint8ClampedArray.prototype.some === "function" && typeof Int16Array.prototype.some === "function" && typeof Uint16Array.prototype.some === "function" && typeof Int32Array.prototype.some === "function" && typeof Uint32Array.prototype.some === "function" && typeof Float32Array.prototype.some === "function" && typeof Float64Array.prototype.some === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.some === "function" && typeof Uint8Array.prototype.some === "function" && typeof Uint8ClampedArray.prototype.some === "function" && typeof Int16Array.prototype.some === "function" && typeof Uint16Array.prototype.some === "function" && typeof Int32Array.prototype.some === "function" && typeof Uint32Array.prototype.some === "function" && typeof Float32Array.prototype.some === "function" && typeof Float64Array.prototype.some === "function";
}
§%TypedArray%.prototype.sort
?
function(){
return typeof Int8Array.prototype.sort === "function" && typeof Uint8Array.prototype.sort === "function" && typeof Uint8ClampedArray.prototype.sort === "function" && typeof Int16Array.prototype.sort === "function" && typeof Uint16Array.prototype.sort === "function" && typeof Int32Array.prototype.sort === "function" && typeof Uint32Array.prototype.sort === "function" && typeof Float32Array.prototype.sort === "function" && typeof Float64Array.prototype.sort === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.sort === "function" && typeof Uint8Array.prototype.sort === "function" && typeof Uint8ClampedArray.prototype.sort === "function" && typeof Int16Array.prototype.sort === "function" && typeof Uint16Array.prototype.sort === "function" && typeof Int32Array.prototype.sort === "function" && typeof Uint32Array.prototype.sort === "function" && typeof Float32Array.prototype.sort === "function" && typeof Float64Array.prototype.sort === "function";
}
§%TypedArray%.prototype.copyWithin
?
function(){
return typeof Int8Array.prototype.copyWithin === "function" && typeof Uint8Array.prototype.copyWithin === "function" && typeof Uint8ClampedArray.prototype.copyWithin === "function" && typeof Int16Array.prototype.copyWithin === "function" && typeof Uint16Array.prototype.copyWithin === "function" && typeof Int32Array.prototype.copyWithin === "function" && typeof Uint32Array.prototype.copyWithin === "function" && typeof Float32Array.prototype.copyWithin === "function" && typeof Float64Array.prototype.copyWithin === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.copyWithin === "function" && typeof Uint8Array.prototype.copyWithin === "function" && typeof Uint8ClampedArray.prototype.copyWithin === "function" && typeof Int16Array.prototype.copyWithin === "function" && typeof Uint16Array.prototype.copyWithin === "function" && typeof Int32Array.prototype.copyWithin === "function" && typeof Uint32Array.prototype.copyWithin === "function" && typeof Float32Array.prototype.copyWithin === "function" && typeof Float64Array.prototype.copyWithin === "function";
}
§%TypedArray%.prototype.find
?
function(){
return typeof Int8Array.prototype.find === "function" && typeof Uint8Array.prototype.find === "function" && typeof Uint8ClampedArray.prototype.find === "function" && typeof Int16Array.prototype.find === "function" && typeof Uint16Array.prototype.find === "function" && typeof Int32Array.prototype.find === "function" && typeof Uint32Array.prototype.find === "function" && typeof Float32Array.prototype.find === "function" && typeof Float64Array.prototype.find === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.find === "function" && typeof Uint8Array.prototype.find === "function" && typeof Uint8ClampedArray.prototype.find === "function" && typeof Int16Array.prototype.find === "function" && typeof Uint16Array.prototype.find === "function" && typeof Int32Array.prototype.find === "function" && typeof Uint32Array.prototype.find === "function" && typeof Float32Array.prototype.find === "function" && typeof Float64Array.prototype.find === "function";
}
§%TypedArray%.prototype.findIndex
?
function(){
return typeof Int8Array.prototype.findIndex === "function" && typeof Uint8Array.prototype.findIndex === "function" && typeof Uint8ClampedArray.prototype.findIndex === "function" && typeof Int16Array.prototype.findIndex === "function" && typeof Uint16Array.prototype.findIndex === "function" && typeof Int32Array.prototype.findIndex === "function" && typeof Uint32Array.prototype.findIndex === "function" && typeof Float32Array.prototype.findIndex === "function" && typeof Float64Array.prototype.findIndex === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.findIndex === "function" && typeof Uint8Array.prototype.findIndex === "function" && typeof Uint8ClampedArray.prototype.findIndex === "function" && typeof Int16Array.prototype.findIndex === "function" && typeof Uint16Array.prototype.findIndex === "function" && typeof Int32Array.prototype.findIndex === "function" && typeof Uint32Array.prototype.findIndex === "function" && typeof Float32Array.prototype.findIndex === "function" && typeof Float64Array.prototype.findIndex === "function";
}
§%TypedArray%.prototype.fill
?
function(){
return typeof Int8Array.prototype.fill === "function" && typeof Uint8Array.prototype.fill === "function" && typeof Uint8ClampedArray.prototype.fill === "function" && typeof Int16Array.prototype.fill === "function" && typeof Uint16Array.prototype.fill === "function" && typeof Int32Array.prototype.fill === "function" && typeof Uint32Array.prototype.fill === "function" && typeof Float32Array.prototype.fill === "function" && typeof Float64Array.prototype.fill === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Int8Array.prototype.fill === "function" && typeof Uint8Array.prototype.fill === "function" && typeof Uint8ClampedArray.prototype.fill === "function" && typeof Int16Array.prototype.fill === "function" && typeof Uint16Array.prototype.fill === "function" && typeof Int32Array.prototype.fill === "function" && typeof Uint32Array.prototype.fill === "function" && typeof Float32Array.prototype.fill === "function" && typeof Float64Array.prototype.fill === "function";
}
§%TypedArray%.prototype.keys
?
function(){
return typeof Int8Array.prototype.keys === "function" && typeof Uint8Array.prototype.keys === "function" && typeof Uint8ClampedArray.prototype.keys === "function" && typeof Int16Array.prototype.keys === "function" && typeof Uint16Array.prototype.keys === "function" && typeof Int32Array.prototype.keys === "function" && typeof Uint32Array.prototype.keys === "function" && typeof Float32Array.prototype.keys === "function" && typeof Float64Array.prototype.keys === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Int8Array.prototype.keys === "function" && typeof Uint8Array.prototype.keys === "function" && typeof Uint8ClampedArray.prototype.keys === "function" && typeof Int16Array.prototype.keys === "function" && typeof Uint16Array.prototype.keys === "function" && typeof Int32Array.prototype.keys === "function" && typeof Uint32Array.prototype.keys === "function" && typeof Float32Array.prototype.keys === "function" && typeof Float64Array.prototype.keys === "function";
}
§%TypedArray%.prototype.values
?
function(){
return typeof Int8Array.prototype.values === "function" && typeof Uint8Array.prototype.values === "function" && typeof Uint8ClampedArray.prototype.values === "function" && typeof Int16Array.prototype.values === "function" && typeof Uint16Array.prototype.values === "function" && typeof Int32Array.prototype.values === "function" && typeof Uint32Array.prototype.values === "function" && typeof Float32Array.prototype.values === "function" && typeof Float64Array.prototype.values === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Int8Array.prototype.values === "function" && typeof Uint8Array.prototype.values === "function" && typeof Uint8ClampedArray.prototype.values === "function" && typeof Int16Array.prototype.values === "function" && typeof Uint16Array.prototype.values === "function" && typeof Int32Array.prototype.values === "function" && typeof Uint32Array.prototype.values === "function" && typeof Float32Array.prototype.values === "function" && typeof Float64Array.prototype.values === "function";
}
§%TypedArray%.prototype.entries
?
function(){
return typeof Int8Array.prototype.entries === "function" && typeof Uint8Array.prototype.entries === "function" && typeof Uint8ClampedArray.prototype.entries === "function" && typeof Int16Array.prototype.entries === "function" && typeof Uint16Array.prototype.entries === "function" && typeof Int32Array.prototype.entries === "function" && typeof Uint32Array.prototype.entries === "function" && typeof Float32Array.prototype.entries === "function" && typeof Float64Array.prototype.entries === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Int8Array.prototype.entries === "function" && typeof Uint8Array.prototype.entries === "function" && typeof Uint8ClampedArray.prototype.entries === "function" && typeof Int16Array.prototype.entries === "function" && typeof Uint16Array.prototype.entries === "function" && typeof Int32Array.prototype.entries === "function" && typeof Uint32Array.prototype.entries === "function" && typeof Float32Array.prototype.entries === "function" && typeof Float64Array.prototype.entries === "function";
}
§%TypedArray%.prototype[Symbol.iterator]
?
function(){
return typeof Int8Array.prototype[Symbol.iterator] === "function" && typeof Uint8Array.prototype[Symbol.iterator] === "function" && typeof Uint8ClampedArray.prototype[Symbol.iterator] === "function" && typeof Int16Array.prototype[Symbol.iterator] === "function" && typeof Uint16Array.prototype[Symbol.iterator] === "function" && typeof Int32Array.prototype[Symbol.iterator] === "function" && typeof Uint32Array.prototype[Symbol.iterator] === "function" && typeof Float32Array.prototype[Symbol.iterator] === "function" && typeof Float64Array.prototype[Symbol.iterator] === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return typeof Int8Array.prototype[Symbol.iterator] === "function" && typeof Uint8Array.prototype[Symbol.iterator] === "function" && typeof Uint8ClampedArray.prototype[Symbol.iterator] === "function" && typeof Int16Array.prototype[Symbol.iterator] === "function" && typeof Uint16Array.prototype[Symbol.iterator] === "function" && typeof Int32Array.prototype[Symbol.iterator] === "function" && typeof Uint32Array.prototype[Symbol.iterator] === "function" && typeof Float32Array.prototype[Symbol.iterator] === "function" && typeof Float64Array.prototype[Symbol.iterator] === "function";
}
§%TypedArray%[Symbol.species]
?
function(){
return typeof Int8Array[Symbol.species] === "function" && typeof Uint8Array[Symbol.species] === "function" && typeof Uint8ClampedArray[Symbol.species] === "function" && typeof Int16Array[Symbol.species] === "function" && typeof Uint16Array[Symbol.species] === "function" && typeof Int32Array[Symbol.species] === "function" && typeof Uint32Array[Symbol.species] === "function" && typeof Float32Array[Symbol.species] === "function" && typeof Float64Array[Symbol.species] === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
return typeof Int8Array[Symbol.species] === "function" && typeof Uint8Array[Symbol.species] === "function" && typeof Uint8ClampedArray[Symbol.species] === "function" && typeof Int16Array[Symbol.species] === "function" && typeof Uint16Array[Symbol.species] === "function" && typeof Int32Array[Symbol.species] === "function" && typeof Uint32Array[Symbol.species] === "function" && typeof Float32Array[Symbol.species] === "function" && typeof Float64Array[Symbol.species] === "function";
}

Map

§basic functionality
?
function(){
var key = {}; var map = new Map(); map.set(key, 123); return map.has(key) && map.get(key) === 123;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
var key = {}; var map = new Map(); map.set(key, 123); return map.has(key) && map.get(key) === 123;
}
§constructor arguments
?
function(){
var key1 = {}; var key2 = {}; var map = new Map([[key1, 123], [key2, 456]]); return map.has(key1) && map.get(key1) === 123 && map.has(key2) && map.get(key2) === 456;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var key1 = {}; var key2 = {}; var map = new Map([[key1, 123], [key2, 456]]); return map.has(key1) && map.get(key1) === 123 && map.has(key2) && map.get(key2) === 456;
}
§constructor requires new
?
function(){
new Map(); try { Map(); return false; } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
new Map(); try { Map(); return false; } catch(e) { return true; }
}
§constructor accepts null
?
function(){
new Map(null); return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
new Map(null); return true;
}
§constructor invokes set
?
function(){
var passed = false; var _set = Map.prototype.set; Map.prototype.set = function(k, v) { passed = true; }; new Map([ [1, 2] ]); Map.prototype.set = _set; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var passed = false; var _set = Map.prototype.set; Map.prototype.set = function(k, v) { passed = true; }; new Map([ [1, 2] ]); Map.prototype.set = _set; return passed;
}
§iterator closing
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { new Map(iter); } catch(e){} return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { new Map(iter); } catch(e){} return closed;
}
§Map.prototype.set returns this
?
function(){
var map = new Map(); return map.set(0, 0) === map;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var map = new Map(); return map.set(0, 0) === map;
}
§-0 key converts to +0
?
function(){
var map = new Map(); map.set(-0, "foo"); var k; map.forEach(function (value, key) { k = 1 / key; }); return k === Infinity && map.get(+0) === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
var map = new Map(); map.set(-0, "foo"); var k; map.forEach(function (value, key) { k = 1 / key; }); return k === Infinity && map.get(+0) === "foo";
}
§Map.prototype.size
?
function(){
var key = {}; var map = new Map(); map.set(key, 123); return map.size === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var key = {}; var map = new Map(); map.set(key, 123); return map.size === 1;
}
§Map.prototype.delete
?
function(){
return typeof Map.prototype.delete === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
return typeof Map.prototype.delete === "function";
}
§Map.prototype.clear
?
function(){
return typeof Map.prototype.clear === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Map.prototype.clear === "function";
}
§Map.prototype.forEach
?
function(){
return typeof Map.prototype.forEach === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Map.prototype.forEach === "function";
}
§Map.prototype.keys
?
function(){
return typeof Map.prototype.keys === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Map.prototype.keys === "function";
}
§Map.prototype.values
?
function(){
return typeof Map.prototype.values === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Map.prototype.values === "function";
}
§Map.prototype.entries
?
function(){
return typeof Map.prototype.entries === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Map.prototype.entries === "function";
}
§Map.prototype[Symbol.iterator]
?
function(){
return typeof Map.prototype[Symbol.iterator] === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return typeof Map.prototype[Symbol.iterator] === "function";
}
§Map.prototype isn't an instance
?
function(){
new Map(); var obj = {}; try { Map.prototype.has(obj); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
new Map(); var obj = {}; try { Map.prototype.has(obj); } catch(e) { return true; }
}
§Map iterator prototype chain
?
function(){
// Iterator instance var iterator = new Map()[Symbol.iterator](); // %MapIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1); return proto2.hasOwnProperty(Symbol.iterator) && !proto1 .hasOwnProperty(Symbol.iterator) && !iterator .hasOwnProperty(Symbol.iterator) && iterator[Symbol.iterator]() === iterator;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
// Iterator instance var iterator = new Map()[Symbol.iterator](); // %MapIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1); return proto2.hasOwnProperty(Symbol.iterator) && !proto1 .hasOwnProperty(Symbol.iterator) && !iterator .hasOwnProperty(Symbol.iterator) && iterator[Symbol.iterator]() === iterator;
}
§Map[Symbol.species]
?
function(){
var prop = Object.getOwnPropertyDescriptor(Map, Symbol.species); return 'get' in prop && Map[Symbol.species] === Map;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var prop = Object.getOwnPropertyDescriptor(Map, Symbol.species); return 'get' in prop && Map[Symbol.species] === Map;
}

Set

§basic functionality
?
function(){
var obj = {}; var set = new Set(); set.add(123); set.add(123); return set.has(123);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
var obj = {}; var set = new Set(); set.add(123); set.add(123); return set.has(123);
}
§constructor arguments
?
function(){
var obj1 = {}; var obj2 = {}; var set = new Set([obj1, obj2]); return set.has(obj1) && set.has(obj2);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var obj1 = {}; var obj2 = {}; var set = new Set([obj1, obj2]); return set.has(obj1) && set.has(obj2);
}
§constructor requires new
?
function(){
new Set(); try { Set(); return false; } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
new Set(); try { Set(); return false; } catch(e) { return true; }
}
§constructor accepts null
?
function(){
new Set(null); return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
new Set(null); return true;
}
§constructor invokes add
?
function(){
var passed = false; var _add = Set.prototype.add; Set.prototype.add = function(v) { passed = true; }; new Set([1]); Set.prototype.add = _add; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var passed = false; var _add = Set.prototype.add; Set.prototype.add = function(v) { passed = true; }; new Set([1]); Set.prototype.add = _add; return passed;
}
§iterator closing
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); var add = Set.prototype.add; Set.prototype.add = function(){ throw 0 }; try { new Set(iter); } catch(e){} Set.prototype.add = add; return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
Error
No
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); var add = Set.prototype.add; Set.prototype.add = function(){ throw 0 }; try { new Set(iter); } catch(e){} Set.prototype.add = add; return closed;
}
§Set.prototype.add returns this
?
function(){
var set = new Set(); return set.add(0) === set;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var set = new Set(); return set.add(0) === set;
}
§-0 key converts to +0
?
function(){
var set = new Set(); set.add(-0); var k; set.forEach(function (value) { k = 1 / value; }); return k === Infinity && set.has(+0);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
var set = new Set(); set.add(-0); var k; set.forEach(function (value) { k = 1 / value; }); return k === Infinity && set.has(+0);
}
§Set.prototype.size
?
function(){
var obj = {}; var set = new Set(); set.add(123); set.add(123); set.add(456); return set.size === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var obj = {}; var set = new Set(); set.add(123); set.add(123); set.add(456); return set.size === 2;
}
§Set.prototype.delete
?
function(){
return typeof Set.prototype.delete === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
return typeof Set.prototype.delete === "function";
}
§Set.prototype.clear
?
function(){
return typeof Set.prototype.clear === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Set.prototype.clear === "function";
}
§Set.prototype.forEach
?
function(){
return typeof Set.prototype.forEach === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Set.prototype.forEach === "function";
}
§Set.prototype.keys
?
function(){
return typeof Set.prototype.keys === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Set.prototype.keys === "function";
}
§Set.prototype.values
?
function(){
return typeof Set.prototype.values === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Set.prototype.values === "function";
}
§Set.prototype.entries
?
function(){
return typeof Set.prototype.entries === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
return typeof Set.prototype.entries === "function";
}
§Set.prototype[Symbol.iterator]
?
function(){
return typeof Set.prototype[Symbol.iterator] === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return typeof Set.prototype[Symbol.iterator] === "function";
}
§Set.prototype isn't an instance
?
function(){
new Set(); var obj = {}; try { Set.prototype.has(obj); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
new Set(); var obj = {}; try { Set.prototype.has(obj); } catch(e) { return true; }
}
§Set iterator prototype chain
?
function(){
// Iterator instance var iterator = new Set()[Symbol.iterator](); // %SetIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1); return proto2.hasOwnProperty(Symbol.iterator) && !proto1 .hasOwnProperty(Symbol.iterator) && !iterator .hasOwnProperty(Symbol.iterator) && iterator[Symbol.iterator]() === iterator;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
// Iterator instance var iterator = new Set()[Symbol.iterator](); // %SetIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1); return proto2.hasOwnProperty(Symbol.iterator) && !proto1 .hasOwnProperty(Symbol.iterator) && !iterator .hasOwnProperty(Symbol.iterator) && iterator[Symbol.iterator]() === iterator;
}
§Set[Symbol.species]
?
function(){
var prop = Object.getOwnPropertyDescriptor(Set, Symbol.species); return 'get' in prop && Set[Symbol.species] === Set;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var prop = Object.getOwnPropertyDescriptor(Set, Symbol.species); return 'get' in prop && Set[Symbol.species] === Set;
}

WeakMap

§basic functionality
?
function(){
var key = {}; var weakmap = new WeakMap(); weakmap.set(key, 123); return weakmap.has(key) && weakmap.get(key) === 123;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
var key = {}; var weakmap = new WeakMap(); weakmap.set(key, 123); return weakmap.has(key) && weakmap.get(key) === 123;
}
§constructor arguments
?
function(){
var key1 = {}; var key2 = {}; var weakmap = new WeakMap([[key1, 123], [key2, 456]]); return weakmap.has(key1) && weakmap.get(key1) === 123 && weakmap.has(key2) && weakmap.get(key2) === 456;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var key1 = {}; var key2 = {}; var weakmap = new WeakMap([[key1, 123], [key2, 456]]); return weakmap.has(key1) && weakmap.get(key1) === 123 && weakmap.has(key2) && weakmap.get(key2) === 456;
}
§constructor requires new
?
function(){
new WeakMap(); try { WeakMap(); return false; } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
new WeakMap(); try { WeakMap(); return false; } catch(e) { return true; }
}
§constructor accepts null
?
function(){
new WeakMap(null); return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
new WeakMap(null); return true;
}
§constructor invokes set
?
function(){
var passed = false; var _set = WeakMap.prototype.set; WeakMap.prototype.set = function(k, v) { passed = true; }; new WeakMap([ [{ }, 42] ]); WeakMap.prototype.set = _set; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var passed = false; var _set = WeakMap.prototype.set; WeakMap.prototype.set = function(k, v) { passed = true; }; new WeakMap([ [{ }, 42] ]); WeakMap.prototype.set = _set; return passed;
}
§frozen objects as keys
?
function(){
var f = Object.freeze({}); var m = new WeakMap; m.set(f, 42); return m.get(f) === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
var f = Object.freeze({}); var m = new WeakMap; m.set(f, 42); return m.get(f) === 42;
}
§iterator closing
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { new WeakMap(iter); } catch(e){} return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { new WeakMap(iter); } catch(e){} return closed;
}
§WeakMap.prototype.set returns this
?
function(){
var weakmap = new WeakMap(); var key = {}; return weakmap.set(key, 0) === weakmap;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
function(){
var weakmap = new WeakMap(); var key = {}; return weakmap.set(key, 0) === weakmap;
}
§WeakMap.prototype.delete
?
function(){
return typeof WeakMap.prototype.delete === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
return typeof WeakMap.prototype.delete === "function";
}
§no WeakMap.prototype.clear method
?
function(){
if (!("clear" in WeakMap.prototype)) { return true; } var m = new WeakMap(); var key = {}; m.set(key, 2); m.clear(); return m.has(key);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Flag
function(){
if (!("clear" in WeakMap.prototype)) { return true; } var m = new WeakMap(); var key = {}; m.set(key, 2); m.clear(); return m.has(key);
}
§.has, .get and .delete methods accept primitives
?
function(){
var m = new WeakMap; return m.has(1) === false && m.get(1) === void undefined && m.delete(1) === false;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var m = new WeakMap; return m.has(1) === false && m.get(1) === void undefined && m.delete(1) === false;
}
§WeakMap.prototype isn't an instance
?
function(){
new WeakMap(); var obj = {}; try { WeakMap.prototype.has(obj); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
function(){
new WeakMap(); var obj = {}; try { WeakMap.prototype.has(obj); } catch(e) { return true; }
}

WeakSet

§basic functionality
?
function(){
var obj1 = {}; var weakset = new WeakSet(); weakset.add(obj1); weakset.add(obj1); return weakset.has(obj1);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var obj1 = {}; var weakset = new WeakSet(); weakset.add(obj1); weakset.add(obj1); return weakset.has(obj1);
}
§constructor arguments
?
function(){
var obj1 = {}, obj2 = {}; var weakset = new WeakSet([obj1, obj2]); return weakset.has(obj1) && weakset.has(obj2);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var obj1 = {}, obj2 = {}; var weakset = new WeakSet([obj1, obj2]); return weakset.has(obj1) && weakset.has(obj2);
}
§constructor requires new
?
function(){
new WeakSet(); try { WeakSet(); return false; } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
new WeakSet(); try { WeakSet(); return false; } catch(e) { return true; }
}
§constructor accepts null
?
function(){
new WeakSet(null); return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
new WeakSet(null); return true;
}
§constructor invokes add
?
function(){
var passed = false; var _add = WeakSet.prototype.add; WeakSet.prototype.add = function(v) { passed = true; }; new WeakSet([ { } ]); WeakSet.prototype.add = _add; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var passed = false; var _add = WeakSet.prototype.add; WeakSet.prototype.add = function(v) { passed = true; }; new WeakSet([ { } ]); WeakSet.prototype.add = _add; return passed;
}
§iterator closing
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { new WeakSet(iter); } catch(e){} return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { new WeakSet(iter); } catch(e){} return closed;
}
§WeakSet.prototype.add returns this
?
function(){
var weakset = new WeakSet(); var obj = {}; return weakset.add(obj) === weakset;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var weakset = new WeakSet(); var obj = {}; return weakset.add(obj) === weakset;
}
§WeakSet.prototype.delete
?
function(){
return typeof WeakSet.prototype.delete === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return typeof WeakSet.prototype.delete === "function";
}
§no WeakSet.prototype.clear method
?
function(){
if (!("clear" in WeakSet.prototype)) { return true; } var s = new WeakSet(); var key = {}; s.add(key); s.clear(); return s.has(key);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
if (!("clear" in WeakSet.prototype)) { return true; } var s = new WeakSet(); var key = {}; s.add(key); s.clear(); return s.has(key);
}
§.has and .delete methods accept primitives
?
function(){
var s = new WeakSet; return s.has(1) === false && s.delete(1) === false;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var s = new WeakSet; return s.has(1) === false && s.delete(1) === false;
}
§WeakSet.prototype isn't an instance
?
function(){
new WeakSet(); var obj = {}; try { WeakSet.prototype.has(obj); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
new WeakSet(); var obj = {}; try { WeakSet.prototype.has(obj); } catch(e) { return true; }
}

Proxy

§constructor requires new
?
function(){
new Proxy({}, {}); try { Proxy({}, {}); return false; } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
new Proxy({}, {}); try { Proxy({}, {}); return false; } catch(e) { return true; }
}
§no "prototype" property
?
function(){
new Proxy({}, {}); return !Proxy.hasOwnProperty('prototype');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
new Proxy({}, {}); return !Proxy.hasOwnProperty('prototype');
}
§"get" handler
?
function(){
var proxied = { }; var proxy = new Proxy(proxied, { get: function (t, k, r) { return t === proxied && k === "foo" && r === proxy && 5; } }); return proxy.foo === 5;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = { }; var proxy = new Proxy(proxied, { get: function (t, k, r) { return t === proxied && k === "foo" && r === proxy && 5; } }); return proxy.foo === 5;
}
§"get" handler, instances of proxies
?
function(){
var proxied = { }; var proxy = Object.create(new Proxy(proxied, { get: function (t, k, r) { return t === proxied && k === "foo" && r === proxy && 5; } })); return proxy.foo === 5;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = { }; var proxy = Object.create(new Proxy(proxied, { get: function (t, k, r) { return t === proxied && k === "foo" && r === proxy && 5; } })); return proxy.foo === 5;
}
§"get" handler invariants
?
function(){
var passed = false; var proxied = { }; var proxy = new Proxy(proxied, { get: function () { passed = true; return 4; } }); // The value reported for a property must be the same as the value of the corresponding // target object property if the target object property is a non-writable, // non-configurable own data property. Object.defineProperty(proxied, "foo", { value: 5, enumerable: true }); try { proxy.foo; return false; } catch(e) {} // The value reported for a property must be undefined if the corresponding target // object property is a non-configurable own accessor property that has undefined // as its [[Get]] attribute. Object.defineProperty(proxied, "bar", { set: function(){}, enumerable: true }); try { proxy.bar; return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; var proxied = { }; var proxy = new Proxy(proxied, { get: function () { passed = true; return 4; } }); // The value reported for a property must be the same as the value of the corresponding // target object property if the target object property is a non-writable, // non-configurable own data property. Object.defineProperty(proxied, "foo", { value: 5, enumerable: true }); try { proxy.foo; return false; } catch(e) {} // The value reported for a property must be undefined if the corresponding target // object property is a non-configurable own accessor property that has undefined // as its [[Get]] attribute. Object.defineProperty(proxied, "bar", { set: function(){}, enumerable: true }); try { proxy.bar; return false; } catch(e) {} return passed;
}
§"set" handler
?
function(){
var proxied = { }; var passed = false; var proxy = new Proxy(proxied, { set: function (t, k, v, r) { passed = t === proxied && k + v === "foobar" && r === proxy; } }); proxy.foo = "bar"; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = { }; var passed = false; var proxy = new Proxy(proxied, { set: function (t, k, v, r) { passed = t === proxied && k + v === "foobar" && r === proxy; } }); proxy.foo = "bar"; return passed;
}
§"set" handler, instances of proxies
?
function(){
var proxied = { }; var passed = false; var proxy = Object.create(new Proxy(proxied, { set: function (t, k, v, r) { passed = t === proxied && k + v === "foobar" && r === proxy; } })); proxy.foo = "bar"; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = { }; var passed = false; var proxy = Object.create(new Proxy(proxied, { set: function (t, k, v, r) { passed = t === proxied && k + v === "foobar" && r === proxy; } })); proxy.foo = "bar"; return passed;
}
§"set" handler invariants
?
function(){
var passed = false; new Proxy({},{}); // Cannot change the value of a property to be different from the value of // the corresponding target object if the corresponding target object // property is a non-writable, non-configurable own data property. var proxied = {}; var proxy = new Proxy(proxied, { set: function () { passed = true; return true; } }); Object.defineProperty(proxied, "foo", { value: 2, enumerable: true }); proxy.foo = 2; try { proxy.foo = 4; return false; } catch(e) {} // Cannot set the value of a property if the corresponding target // object property is a non-configurable own accessor property // that has undefined as its [[Set]] attribute. Object.defineProperty(proxied, "bar", { get: function(){}, enumerable: true }); try { proxy.bar = 2; return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // Cannot change the value of a property to be different from the value of // the corresponding target object if the corresponding target object // property is a non-writable, non-configurable own data property. var proxied = {}; var proxy = new Proxy(proxied, { set: function () { passed = true; return true; } }); Object.defineProperty(proxied, "foo", { value: 2, enumerable: true }); proxy.foo = 2; try { proxy.foo = 4; return false; } catch(e) {} // Cannot set the value of a property if the corresponding target // object property is a non-configurable own accessor property // that has undefined as its [[Set]] attribute. Object.defineProperty(proxied, "bar", { get: function(){}, enumerable: true }); try { proxy.bar = 2; return false; } catch(e) {} return passed;
}
§"has" handler
?
function(){
var proxied = {}; var passed = false; "foo" in new Proxy(proxied, { has: function (t, k) { passed = t === proxied && k === "foo"; } }); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var passed = false; "foo" in new Proxy(proxied, { has: function (t, k) { passed = t === proxied && k === "foo"; } }); return passed;
}
§"has" handler, instances of proxies
?
function(){
var proxied = {}; var passed = false; "foo" in Object.create(new Proxy(proxied, { has: function (t, k) { passed = t === proxied && k === "foo"; } })); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var passed = false; "foo" in Object.create(new Proxy(proxied, { has: function (t, k) { passed = t === proxied && k === "foo"; } })); return passed;
}
§"has" handler invariants
?
function(){
var passed = false; new Proxy({},{}); // A property cannot be reported as non-existent, if it exists as a // non-configurable own property of the target object. var proxied = {}; var proxy = new Proxy(proxied, { has: function () { passed = true; return false; } }); Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true }); try { 'foo' in proxy; return false; } catch(e) {} // A property cannot be reported as non-existent, if it exists as an // own property of the target object and the target object is not extensible. proxied.bar = 2; Object.preventExtensions(proxied); try { 'bar' in proxy; return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // A property cannot be reported as non-existent, if it exists as a // non-configurable own property of the target object. var proxied = {}; var proxy = new Proxy(proxied, { has: function () { passed = true; return false; } }); Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true }); try { 'foo' in proxy; return false; } catch(e) {} // A property cannot be reported as non-existent, if it exists as an // own property of the target object and the target object is not extensible. proxied.bar = 2; Object.preventExtensions(proxied); try { 'bar' in proxy; return false; } catch(e) {} return passed;
}
§"deleteProperty" handler
?
function(){
var proxied = {}; var passed = false; delete new Proxy(proxied, { deleteProperty: function (t, k) { passed = t === proxied && k === "foo"; } }).foo; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var passed = false; delete new Proxy(proxied, { deleteProperty: function (t, k) { passed = t === proxied && k === "foo"; } }).foo; return passed;
}
§"deleteProperty" handler invariant
?
function(){
var passed = false; new Proxy({},{}); // A property cannot be reported as deleted, if it exists as a non-configurable // own property of the target object. var proxied = {}; Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true }); try { delete new Proxy(proxied, { deleteProperty: function () { passed = true; return true; } }).foo; return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // A property cannot be reported as deleted, if it exists as a non-configurable // own property of the target object. var proxied = {}; Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true }); try { delete new Proxy(proxied, { deleteProperty: function () { passed = true; return true; } }).foo; return false; } catch(e) {} return passed;
}
§"getOwnPropertyDescriptor" handler
?
function(){
var proxied = {}; var fakeDesc = { value: "foo", configurable: true }; var returnedDesc = Object.getOwnPropertyDescriptor( new Proxy(proxied, { getOwnPropertyDescriptor: function (t, k) { return t === proxied && k === "foo" && fakeDesc; } }), "foo" ); return (returnedDesc.value === fakeDesc.value && returnedDesc.configurable === fakeDesc.configurable && returnedDesc.writable === false && returnedDesc.enumerable === false);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var fakeDesc = { value: "foo", configurable: true }; var returnedDesc = Object.getOwnPropertyDescriptor( new Proxy(proxied, { getOwnPropertyDescriptor: function (t, k) { return t === proxied && k === "foo" && fakeDesc; } }), "foo" ); return (returnedDesc.value === fakeDesc.value && returnedDesc.configurable === fakeDesc.configurable && returnedDesc.writable === false && returnedDesc.enumerable === false);
}
§"getOwnPropertyDescriptor" handler invariants
?
function(){
var passed = false; new Proxy({},{}); // A property cannot be reported as non-existent, if it exists as a non-configurable // own property of the target object. var proxied = {}; var proxy = new Proxy(proxied, { getOwnPropertyDescriptor: function () { passed = true; return undefined; } }); Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true }); try { Object.getOwnPropertyDescriptor(proxy, "foo"); return false; } catch(e) {} // A property cannot be reported as non-existent, if it exists as an own property // of the target object and the target object is not extensible. proxied.bar = 3; Object.preventExtensions(proxied); try { Object.getOwnPropertyDescriptor(proxy, "bar"); return false; } catch(e) {} // A property cannot be reported as existent, if it does not exists as an own property // of the target object and the target object is not extensible. try { Object.getOwnPropertyDescriptor(new Proxy(proxied, { getOwnPropertyDescriptor: function() { return { value: 2, configurable: true, writable: true, enumerable: true }; }}), "baz"); return false; } catch(e) {} // A property cannot be reported as non-configurable, if it does not exists as an own // property of the target object or if it exists as a configurable own property of // the target object. try { Object.getOwnPropertyDescriptor(new Proxy({}, { getOwnPropertyDescriptor: function() { return { value: 2, configurable: false, writable: true, enumerable: true }; }}), "baz"); return false; } catch(e) {} try { Object.getOwnPropertyDescriptor(new Proxy({baz:1}, { getOwnPropertyDescriptor: function() { return { value: 1, configurable: false, writable: true, enumerable: true }; }}), "baz"); return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // A property cannot be reported as non-existent, if it exists as a non-configurable // own property of the target object. var proxied = {}; var proxy = new Proxy(proxied, { getOwnPropertyDescriptor: function () { passed = true; return undefined; } }); Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true }); try { Object.getOwnPropertyDescriptor(proxy, "foo"); return false; } catch(e) {} // A property cannot be reported as non-existent, if it exists as an own property // of the target object and the target object is not extensible. proxied.bar = 3; Object.preventExtensions(proxied); try { Object.getOwnPropertyDescriptor(proxy, "bar"); return false; } catch(e) {} // A property cannot be reported as existent, if it does not exists as an own property // of the target object and the target object is not extensible. try { Object.getOwnPropertyDescriptor(new Proxy(proxied, { getOwnPropertyDescriptor: function() { return { value: 2, configurable: true, writable: true, enumerable: true }; }}), "baz"); return false; } catch(e) {} // A property cannot be reported as non-configurable, if it does not exists as an own // property of the target object or if it exists as a configurable own property of // the target object. try { Object.getOwnPropertyDescriptor(new Proxy({}, { getOwnPropertyDescriptor: function() { return { value: 2, configurable: false, writable: true, enumerable: true }; }}), "baz"); return false; } catch(e) {} try { Object.getOwnPropertyDescriptor(new Proxy({baz:1}, { getOwnPropertyDescriptor: function() { return { value: 1, configurable: false, writable: true, enumerable: true }; }}), "baz"); return false; } catch(e) {} return passed;
}
§"defineProperty" handler
?
function(){
var proxied = {}; var passed = false; Object.defineProperty( new Proxy(proxied, { defineProperty: function (t, k, d) { passed = t === proxied && k === "foo" && d.value === 5; return true; } }), "foo", { value: 5, configurable: true } ); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var passed = false; Object.defineProperty( new Proxy(proxied, { defineProperty: function (t, k, d) { passed = t === proxied && k === "foo" && d.value === 5; return true; } }), "foo", { value: 5, configurable: true } ); return passed;
}
§"defineProperty" handler invariants
?
function(){
var passed = false; new Proxy({},{}); // A property cannot be added, if the target object is not extensible. var proxied = Object.preventExtensions({}); var proxy = new Proxy(proxied, { defineProperty: function() { passed = true; return true; } }); try { Object.defineProperty(proxy, "foo", { value: 2 }); return false; } catch(e) {} // A property cannot be non-configurable, unless there exists a corresponding // non-configurable own property of the target object. try { Object.defineProperty( new Proxy({ bar: true }, { defineProperty: function () { return true; } }), "bar", { value: 5, configurable: false, writable: true, enumerable: true } ); return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // A property cannot be added, if the target object is not extensible. var proxied = Object.preventExtensions({}); var proxy = new Proxy(proxied, { defineProperty: function() { passed = true; return true; } }); try { Object.defineProperty(proxy, "foo", { value: 2 }); return false; } catch(e) {} // A property cannot be non-configurable, unless there exists a corresponding // non-configurable own property of the target object. try { Object.defineProperty( new Proxy({ bar: true }, { defineProperty: function () { return true; } }), "bar", { value: 5, configurable: false, writable: true, enumerable: true } ); return false; } catch(e) {} return passed;
}
§"getPrototypeOf" handler
?
function(){
var proxied = {}; var fakeProto = {}; var proxy = new Proxy(proxied, { getPrototypeOf: function (t) { return t === proxied && fakeProto; } }); return Object.getPrototypeOf(proxy) === fakeProto;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var fakeProto = {}; var proxy = new Proxy(proxied, { getPrototypeOf: function (t) { return t === proxied && fakeProto; } }); return Object.getPrototypeOf(proxy) === fakeProto;
}
§"getPrototypeOf" handler invariant
?
function(){
var passed = false; new Proxy({},{}); // If the target object is not extensible, [[GetPrototypeOf]] applied to the proxy object // must return the same value as [[GetPrototypeOf]] applied to the proxy object's target object. try { Object.getPrototypeOf(new Proxy(Object.preventExtensions({}), { getPrototypeOf: function () { passed = true; return {}; } })); return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // If the target object is not extensible, [[GetPrototypeOf]] applied to the proxy object // must return the same value as [[GetPrototypeOf]] applied to the proxy object's target object. try { Object.getPrototypeOf(new Proxy(Object.preventExtensions({}), { getPrototypeOf: function () { passed = true; return {}; } })); return false; } catch(e) {} return passed;
}
§"setPrototypeOf" handler
?
function(){
var proxied = {}; var newProto = {}; var passed = false; Object.setPrototypeOf( new Proxy(proxied, { setPrototypeOf: function (t, p) { passed = t === proxied && p === newProto; return true; } }), newProto ); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var newProto = {}; var passed = false; Object.setPrototypeOf( new Proxy(proxied, { setPrototypeOf: function (t, p) { passed = t === proxied && p === newProto; return true; } }), newProto ); return passed;
}
§"setPrototypeOf" handler invariant
?
function(){
var passed = false; new Proxy({},{}); Object.setPrototypeOf({},{}); // If the target object is not extensible, the argument value must be the // same as the result of [[GetPrototypeOf]] applied to target object. try { Object.setPrototypeOf( new Proxy(Object.preventExtensions({}), { setPrototypeOf: function () { passed = true; return true; } }),{}); return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); Object.setPrototypeOf({},{}); // If the target object is not extensible, the argument value must be the // same as the result of [[GetPrototypeOf]] applied to target object. try { Object.setPrototypeOf( new Proxy(Object.preventExtensions({}), { setPrototypeOf: function () { passed = true; return true; } }),{}); return false; } catch(e) {} return passed;
}
§"isExtensible" handler
?
function(){
var proxied = {}; var passed = false; Object.isExtensible( new Proxy(proxied, { isExtensible: function (t) { passed = t === proxied; return true; } }) ); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var passed = false; Object.isExtensible( new Proxy(proxied, { isExtensible: function (t) { passed = t === proxied; return true; } }) ); return passed;
}
§"isExtensible" handler invariant
?
function(){
var passed = false; new Proxy({},{}); // [[IsExtensible]] applied to the proxy object must return the same value // as [[IsExtensible]] applied to the proxy object's target object with the same argument. try { Object.isExtensible(new Proxy({}, { isExtensible: function (t) { passed = true; return false; } })); return false; } catch(e) {} try { Object.isExtensible(new Proxy(Object.preventExtensions({}), { isExtensible: function (t) { return true; } })); return false; } catch(e) {} return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // [[IsExtensible]] applied to the proxy object must return the same value // as [[IsExtensible]] applied to the proxy object's target object with the same argument. try { Object.isExtensible(new Proxy({}, { isExtensible: function (t) { passed = true; return false; } })); return false; } catch(e) {} try { Object.isExtensible(new Proxy(Object.preventExtensions({}), { isExtensible: function (t) { return true; } })); return false; } catch(e) {} return true;
}
§"preventExtensions" handler
?
function(){
var proxied = {}; var passed = false; Object.preventExtensions( new Proxy(proxied, { preventExtensions: function (t) { passed = t === proxied; return Object.preventExtensions(proxied); } }) ); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var passed = false; Object.preventExtensions( new Proxy(proxied, { preventExtensions: function (t) { passed = t === proxied; return Object.preventExtensions(proxied); } }) ); return passed;
}
§"preventExtensions" handler invariant
?
function(){
var passed = false; new Proxy({},{}); // [[PreventExtensions]] applied to the proxy object only returns true // if [[IsExtensible]] applied to the proxy object's target object is false. try { Object.preventExtensions(new Proxy({}, { preventExtensions: function () { passed = true; return true; } })); return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // [[PreventExtensions]] applied to the proxy object only returns true // if [[IsExtensible]] applied to the proxy object's target object is false. try { Object.preventExtensions(new Proxy({}, { preventExtensions: function () { passed = true; return true; } })); return false; } catch(e) {} return passed;
}
§"ownKeys" handler
?
function(){
var proxied = {}; var passed = false; Object.keys( new Proxy(proxied, { ownKeys: function (t) { passed = t === proxied; return []; } }) ); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = {}; var passed = false; Object.keys( new Proxy(proxied, { ownKeys: function (t) { passed = t === proxied; return []; } }) ); return passed;
}
§"ownKeys" handler invariant
?
function(){
var passed = false; new Proxy({},{}); // The Type of each result List element is either String or Symbol. try { Object.keys(new Proxy({}, { ownKeys: function () { passed = true; return [2]; }})); return false; } catch(e) {} // The result List must contain the keys of all non-configurable own properties of the target object. var proxied = {}; Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true }); try { Object.keys(new Proxy(proxied, { ownKeys: function () { return []; }})); return false; } catch(e) {} // If the target object is not extensible, then the result List must contain all the keys // of the own properties of the target object and no other values. try { Object.keys(new Proxy(Object.preventExtensions({b:1}), { ownKeys: function () { return ['a']; }})); return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // The Type of each result List element is either String or Symbol. try { Object.keys(new Proxy({}, { ownKeys: function () { passed = true; return [2]; }})); return false; } catch(e) {} // The result List must contain the keys of all non-configurable own properties of the target object. var proxied = {}; Object.defineProperty(proxied, "foo", { value: 2, writable: true, enumerable: true }); try { Object.keys(new Proxy(proxied, { ownKeys: function () { return []; }})); return false; } catch(e) {} // If the target object is not extensible, then the result List must contain all the keys // of the own properties of the target object and no other values. try { Object.keys(new Proxy(Object.preventExtensions({b:1}), { ownKeys: function () { return ['a']; }})); return false; } catch(e) {} return passed;
}
§"apply" handler
?
function(){
var proxied = function(){}; var passed = false; var host = { method: new Proxy(proxied, { apply: function (t, thisArg, args) { passed = t === proxied && thisArg === host && args + "" === "foo,bar"; } }) }; host.method("foo", "bar"); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = function(){}; var passed = false; var host = { method: new Proxy(proxied, { apply: function (t, thisArg, args) { passed = t === proxied && thisArg === host && args + "" === "foo,bar"; } }) }; host.method("foo", "bar"); return passed;
}
§"apply" handler invariant
?
function(){
var passed = false; new Proxy(function(){}, { apply: function () { passed = true; } })(); // A Proxy exotic object only has a [[Call]] internal method if the // initial value of its [[ProxyTarget]] internal slot is an object // that has a [[Call]] internal method. try { new Proxy({}, { apply: function () {} })(); return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy(function(){}, { apply: function () { passed = true; } })(); // A Proxy exotic object only has a [[Call]] internal method if the // initial value of its [[ProxyTarget]] internal slot is an object // that has a [[Call]] internal method. try { new Proxy({}, { apply: function () {} })(); return false; } catch(e) {} return passed;
}
§"construct" handler
?
function(){
var proxied = function(){}; var passed = false; new new Proxy(proxied, { construct: function (t, args) { passed = t === proxied && args + "" === "foo,bar"; return {}; } })("foo","bar"); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var proxied = function(){}; var passed = false; new new Proxy(proxied, { construct: function (t, args) { passed = t === proxied && args + "" === "foo,bar"; return {}; } })("foo","bar"); return passed;
}
§"construct" handler invariants
?
function(){
var passed = false; new Proxy({},{}); // A Proxy exotic object only has a [[Construct]] internal method if the // initial value of its [[ProxyTarget]] internal slot is an object // that has a [[Construct]] internal method. try { new new Proxy({}, { construct: function (t, args) { return {}; } })(); return false; } catch(e) {} // The result of [[Construct]] must be an Object. try { new new Proxy(function(){}, { construct: function (t, args) { passed = true; return 5; } })(); return false; } catch(e) {} return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = false; new Proxy({},{}); // A Proxy exotic object only has a [[Construct]] internal method if the // initial value of its [[ProxyTarget]] internal slot is an object // that has a [[Construct]] internal method. try { new new Proxy({}, { construct: function (t, args) { return {}; } })(); return false; } catch(e) {} // The result of [[Construct]] must be an Object. try { new new Proxy(function(){}, { construct: function (t, args) { passed = true; return 5; } })(); return false; } catch(e) {} return passed;
}
§Proxy.revocable
?
function(){
var obj = Proxy.revocable({}, { get: function() { return 5; } }); var passed = (obj.proxy.foo === 5); obj.revoke(); try { obj.proxy.foo; } catch(e) { passed &= e instanceof TypeError; } return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = Proxy.revocable({}, { get: function() { return 5; } }); var passed = (obj.proxy.foo === 5); obj.revoke(); try { obj.proxy.foo; } catch(e) { passed &= e instanceof TypeError; } return passed;
}
§Array.isArray support
?
function(){
return Array.isArray(new Proxy([], {}));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Array.isArray(new Proxy([], {}));
}
§JSON.stringify support
?
function(){
return JSON.stringify(new Proxy(['foo'], {})) === '["foo"]';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return JSON.stringify(new Proxy(['foo'], {})) === '["foo"]';
}

Reflect

§Reflect.get
?
function(){
return Reflect.get({ qux: 987 }, "qux") === 987;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Reflect.get({ qux: 987 }, "qux") === 987;
}
§Reflect.set
?
function(){
var obj = {}; Reflect.set(obj, "quux", 654); return obj.quux === 654;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = {}; Reflect.set(obj, "quux", 654); return obj.quux === 654;
}
§Reflect.has
?
function(){
return Reflect.has({ qux: 987 }, "qux");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Reflect.has({ qux: 987 }, "qux");
}
§Reflect.deleteProperty
?
function(){
var obj = { bar: 456 }; Reflect.deleteProperty(obj, "bar"); return !("bar" in obj);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = { bar: 456 }; Reflect.deleteProperty(obj, "bar"); return !("bar" in obj);
}
§Reflect.getOwnPropertyDescriptor
?
function(){
var obj = { baz: 789 }; var desc = Reflect.getOwnPropertyDescriptor(obj, "baz"); return desc.value === 789 && desc.configurable && desc.writable && desc.enumerable;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = { baz: 789 }; var desc = Reflect.getOwnPropertyDescriptor(obj, "baz"); return desc.value === 789 && desc.configurable && desc.writable && desc.enumerable;
}
§Reflect.defineProperty
?
function(){
var obj = {}; Reflect.defineProperty(obj, "foo", { value: 123 }); return obj.foo === 123 && Reflect.defineProperty(Object.freeze({}), "foo", { value: 123 }) === false;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = {}; Reflect.defineProperty(obj, "foo", { value: 123 }); return obj.foo === 123 && Reflect.defineProperty(Object.freeze({}), "foo", { value: 123 }) === false;
}
§Reflect.getPrototypeOf
?
function(){
return Reflect.getPrototypeOf([]) === Array.prototype;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Reflect.getPrototypeOf([]) === Array.prototype;
}
§Reflect.setPrototypeOf
?
function(){
var obj = {}; Reflect.setPrototypeOf(obj, Array.prototype); return obj instanceof Array;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = {}; Reflect.setPrototypeOf(obj, Array.prototype); return obj instanceof Array;
}
§Reflect.isExtensible
?
function(){
return Reflect.isExtensible({}) && !Reflect.isExtensible(Object.preventExtensions({}));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Reflect.isExtensible({}) && !Reflect.isExtensible(Object.preventExtensions({}));
}
§Reflect.preventExtensions
?
function(){
var obj = {}; Reflect.preventExtensions(obj); return !Object.isExtensible(obj);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = {}; Reflect.preventExtensions(obj); return !Object.isExtensible(obj);
}
§Reflect.ownKeys, string keys
?
function(){
var obj = Object.create({ C: true }); obj.A = true; Object.defineProperty(obj, 'B', { value: true, enumerable: false }); return Reflect.ownKeys(obj).sort() + '' === "A,B";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = Object.create({ C: true }); obj.A = true; Object.defineProperty(obj, 'B', { value: true, enumerable: false }); return Reflect.ownKeys(obj).sort() + '' === "A,B";
}
§Reflect.ownKeys, symbol keys
?
function(){
var s1 = Symbol(), s2 = Symbol(), s3 = Symbol(); var proto = {}; proto[s1] = true; var obj = Object.create(proto); obj[s2] = true; Object.defineProperty(obj, s3, { value: true, enumerable: false }); var keys = Reflect.ownKeys(obj); return keys.indexOf(s2) >-1 && keys.indexOf(s3) >-1 && keys.length === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var s1 = Symbol(), s2 = Symbol(), s3 = Symbol(); var proto = {}; proto[s1] = true; var obj = Object.create(proto); obj[s2] = true; Object.defineProperty(obj, s3, { value: true, enumerable: false }); var keys = Reflect.ownKeys(obj); return keys.indexOf(s2) >-1 && keys.indexOf(s3) >-1 && keys.length === 2;
}
§Reflect.apply
?
function(){
return Reflect.apply(Array.prototype.push, [1,2], [3,4,5]) === 5;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Reflect.apply(Array.prototype.push, [1,2], [3,4,5]) === 5;
}
§Reflect.construct
?
function(){
return Reflect.construct(function(a, b, c) { this.qux = a + b + c; }, ["foo", "bar", "baz"]).qux === "foobarbaz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Reflect.construct(function(a, b, c) { this.qux = a + b + c; }, ["foo", "bar", "baz"]).qux === "foobarbaz";
}
§Reflect.construct sets new.target meta-property
?
function(){
return Reflect.construct(function(a, b, c) { if (new.target === Object) { this.qux = a + b + c; } }, ["foo", "bar", "baz"], Object).qux === "foobarbaz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Reflect.construct(function(a, b, c) { if (new.target === Object) { this.qux = a + b + c; } }, ["foo", "bar", "baz"], Object).qux === "foobarbaz";
}
§Reflect.construct creates instances from third argument
?
function(){
function F(){} var obj = Reflect.construct(function(){ this.y = 1; }, [], F); return obj.y === 1 && obj instanceof F;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function F(){} var obj = Reflect.construct(function(){ this.y = 1; }, [], F); return obj.y === 1 && obj instanceof F;
}
§Reflect.construct, Array subclassing
?
function(){
function F(){} var obj = Reflect.construct(Array, [], F); obj[2] = 'foo'; return obj.length === 3 && obj instanceof F;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function F(){} var obj = Reflect.construct(Array, [], F); obj[2] = 'foo'; return obj.length === 3 && obj instanceof F;
}
§Reflect.construct, RegExp subclassing
?
function(){
function F(){} var obj = Reflect.construct(RegExp, ["baz","g"], F); return RegExp.prototype.exec.call(obj, "foobarbaz")[0] === "baz" && obj.lastIndex === 9 && obj instanceof F;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function F(){} var obj = Reflect.construct(RegExp, ["baz","g"], F); return RegExp.prototype.exec.call(obj, "foobarbaz")[0] === "baz" && obj.lastIndex === 9 && obj instanceof F;
}
§Reflect.construct, Function subclassing
?
function(){
function F(){} var obj = Reflect.construct(Function, ["return 2"], F); return obj() === 2 && obj instanceof F;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function F(){} var obj = Reflect.construct(Function, ["return 2"], F); return obj() === 2 && obj instanceof F;
}
§Reflect.construct, Promise subclassing
?
function(){
function F(){} var p1 = Reflect.construct(Promise,[function(resolve, reject) { resolve("foo"); }], F); var p2 = Reflect.construct(Promise,[function(resolve, reject) { reject("quux"); }], F); var score = +(p1 instanceof F && p2 instanceof F); function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "quux"); check(); } function shouldNotRun(result) { score = -Infinity; } p1.then = p2.then = Promise.prototype.then; p1.catch = p2.catch = Promise.prototype.catch; p1.then(thenFn, shouldNotRun); p2.then(shouldNotRun, catchFn); p1.catch(shouldNotRun); p2.catch(catchFn); function check() { if (score === 4) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function F(){} var p1 = Reflect.construct(Promise,[function(resolve, reject) { resolve("foo"); }], F); var p2 = Reflect.construct(Promise,[function(resolve, reject) { reject("quux"); }], F); var score = +(p1 instanceof F && p2 instanceof F); function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "quux"); check(); } function shouldNotRun(result) { score = -Infinity; } p1.then = p2.then = Promise.prototype.then; p1.catch = p2.catch = Promise.prototype.catch; p1.then(thenFn, shouldNotRun); p2.then(shouldNotRun, catchFn); p1.catch(shouldNotRun); p2.catch(catchFn); function check() { if (score === 4) asyncTestPassed(); }
}

Promise

§basic functionality
?
function(){
var p1 = new Promise(function(resolve, reject) { resolve("foo"); }); var p2 = new Promise(function(resolve, reject) { reject("quux"); }); var score = 0; function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "quux"); check(); } function shouldNotRun(result) { score = -Infinity; } p1.then(thenFn, shouldNotRun); p2.then(shouldNotRun, catchFn); p1.catch(shouldNotRun); p2.catch(catchFn); p1.then(function() { // Promise.prototype.then() should return a new Promise score += p1.then() !== p1; check(); }); function check() { if (score === 4) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var p1 = new Promise(function(resolve, reject) { resolve("foo"); }); var p2 = new Promise(function(resolve, reject) { reject("quux"); }); var score = 0; function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "quux"); check(); } function shouldNotRun(result) { score = -Infinity; } p1.then(thenFn, shouldNotRun); p2.then(shouldNotRun, catchFn); p1.catch(shouldNotRun); p2.catch(catchFn); p1.then(function() { // Promise.prototype.then() should return a new Promise score += p1.then() !== p1; check(); }); function check() { if (score === 4) asyncTestPassed(); }
}
§constructor requires new
?
function(){
new Promise(function(){}); try { Promise(function(){}); return false; } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
new Promise(function(){}); try { Promise(function(){}); return false; } catch(e) { return true; }
}
§Promise.prototype isn't an instance
?
function(){
new Promise(function(){}); try { Promise.prototype.then(function(){}); } catch (e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
new Promise(function(){}); try { Promise.prototype.then(function(){}); } catch (e) { return true; }
}
§Promise.all
?
function(){
var fulfills = Promise.all([ new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }), new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }) ]); var rejects = Promise.all([ new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }), new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }) ]); var score = 0; fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); }); rejects.catch(function(result) { score += (result === "qux"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var fulfills = Promise.all([ new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }), new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }) ]); var rejects = Promise.all([ new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }), new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }) ]); var score = 0; fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); }); rejects.catch(function(result) { score += (result === "qux"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
§Promise.all, generic iterables
?
function(){
var fulfills = Promise.all(global.__createIterableObject([ new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }), new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }) ])); var rejects = Promise.all(global.__createIterableObject([ new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }), new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }) ])); var score = 0; fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); }); rejects.catch(function(result) { score += (result === "qux"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
var fulfills = Promise.all(global.__createIterableObject([ new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }), new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }) ])); var rejects = Promise.all(global.__createIterableObject([ new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }), new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }) ])); var score = 0; fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); }); rejects.catch(function(result) { score += (result === "qux"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
§Promise.race
?
function(){
var fulfills = Promise.race([ new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }), new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }) ]); var rejects = Promise.race([ new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }), new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }) ]); var score = 0; fulfills.then(function(result) { score += (result === "foo"); check(); }); rejects.catch(function(result) { score += (result === "baz"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var fulfills = Promise.race([ new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }), new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }) ]); var rejects = Promise.race([ new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }), new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }) ]); var score = 0; fulfills.then(function(result) { score += (result === "foo"); check(); }); rejects.catch(function(result) { score += (result === "baz"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
§Promise.race, generic iterables
?
function(){
var fulfills = Promise.race(global.__createIterableObject([ new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }), new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }) ])); var rejects = Promise.race(global.__createIterableObject([ new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }), new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }) ])); var score = 0; fulfills.then(function(result) { score += (result === "foo"); check(); }); rejects.catch(function(result) { score += (result === "baz"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
var fulfills = Promise.race(global.__createIterableObject([ new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }), new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }) ])); var rejects = Promise.race(global.__createIterableObject([ new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }), new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }) ])); var score = 0; fulfills.then(function(result) { score += (result === "foo"); check(); }); rejects.catch(function(result) { score += (result === "baz"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
§Promise[Symbol.species]
?
function(){
var prop = Object.getOwnPropertyDescriptor(Promise, Symbol.species); return 'get' in prop && Promise[Symbol.species] === Promise;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var prop = Object.getOwnPropertyDescriptor(Promise, Symbol.species); return 'get' in prop && Promise[Symbol.species] === Promise;
}

Symbol

§basic functionality
?
function(){
var object = {}; var symbol = Symbol(); var value = {}; object[symbol] = value; return object[symbol] === value;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var object = {}; var symbol = Symbol(); var value = {}; object[symbol] = value; return object[symbol] === value;
}
§typeof support
?
function(){
return typeof Symbol() === "symbol";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return typeof Symbol() === "symbol";
}
§symbol keys are hidden to pre-ES6 code
?
function(){
var object = {}; var symbol = Symbol(); object[symbol] = 1; for (var x in object){} var passed = !x; if (Object.keys && Object.getOwnPropertyNames) { passed &= Object.keys(object).length === 0 && Object.getOwnPropertyNames(object).length === 0; } return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var object = {}; var symbol = Symbol(); object[symbol] = 1; for (var x in object){} var passed = !x; if (Object.keys && Object.getOwnPropertyNames) { passed &= Object.keys(object).length === 0 && Object.getOwnPropertyNames(object).length === 0; } return passed;
}
§Object.defineProperty support
?
function(){
var object = {}; var symbol = Symbol(); var value = {}; if (Object.defineProperty) { Object.defineProperty(object, symbol, { value: value }); return object[symbol] === value; } return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var object = {}; var symbol = Symbol(); var value = {}; if (Object.defineProperty) { Object.defineProperty(object, symbol, { value: value }); return object[symbol] === value; } return passed;
}
§symbols inherit from Symbol.prototype
?
function(){
var symbol = Symbol(); var passed = symbol.foo === void undefined; Symbol.prototype.foo = 2; passed &= symbol.foo === 2; delete Symbol.prototype.foo; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var symbol = Symbol(); var passed = symbol.foo === void undefined; Symbol.prototype.foo = 2; passed &= symbol.foo === 2; delete Symbol.prototype.foo; return passed;
}
§cannot coerce to string or number
?
function(){
var symbol = Symbol(); try { symbol + ""; return false; } catch(e) {} try { symbol + 0; return false; } catch(e) {} return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var symbol = Symbol(); try { symbol + ""; return false; } catch(e) {} try { symbol + 0; return false; } catch(e) {} return true;
}
§can convert with String()
?
function(){
return String(Symbol("foo")) === "Symbol(foo)";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return String(Symbol("foo")) === "Symbol(foo)";
}
§new Symbol() throws
?
function(){
var symbol = Symbol(); try { new Symbol(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var symbol = Symbol(); try { new Symbol(); } catch(e) { return true; }
}
§Object(symbol)
?
function(){
var symbol = Symbol(); var symbolObject = Object(symbol); return typeof symbolObject === "object" && symbolObject instanceof Symbol && symbolObject == symbol && // eslint-disable-line eqeqeq symbolObject !== symbol && symbolObject.valueOf() === symbol;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var symbol = Symbol(); var symbolObject = Object(symbol); return typeof symbolObject === "object" && symbolObject instanceof Symbol && symbolObject == symbol && // eslint-disable-line eqeqeq symbolObject !== symbol && symbolObject.valueOf() === symbol;
}
§JSON.stringify ignores symbol primitives
?
function(){
var object = { foo: Symbol() }; object[Symbol()] = 1; var array = [Symbol()]; return JSON.stringify(object) === '{}' && JSON.stringify(array) === '[null]' && JSON.stringify(Symbol()) === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var object = { foo: Symbol() }; object[Symbol()] = 1; var array = [Symbol()]; return JSON.stringify(object) === '{}' && JSON.stringify(array) === '[null]' && JSON.stringify(Symbol()) === void undefined;
}
§JSON.stringify ignores symbol objects
?
function(){
var testSymbolObject = function (sym) { var object = { foo: sym }; try { // some browsers throw a TypeError when setting symbol object keys. // this isn't part of this test, so, ignore it if so. object[sym] = 1; } catch (e) {} // some browsers throw a TypeError when setting symbol object keys. var array = [sym]; return JSON.stringify(object) === '{"foo":{}}' && JSON.stringify(array) === '[{}]' && JSON.stringify(sym) === '{}'; }; var objSym = Object(Symbol()); var symNoToJSON = Object(Symbol()); Object.defineProperty(symNoToJSON, 'toJSON', { enumerable: false, value: null }); // ensure it overrides the prototype, but is not callable return testSymbolObject(objSym) && testSymbolObject(symNoToJSON);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var testSymbolObject = function (sym) { var object = { foo: sym }; try { // some browsers throw a TypeError when setting symbol object keys. // this isn't part of this test, so, ignore it if so. object[sym] = 1; } catch (e) {} // some browsers throw a TypeError when setting symbol object keys. var array = [sym]; return JSON.stringify(object) === '{"foo":{}}' && JSON.stringify(array) === '[{}]' && JSON.stringify(sym) === '{}'; }; var objSym = Object(Symbol()); var symNoToJSON = Object(Symbol()); Object.defineProperty(symNoToJSON, 'toJSON', { enumerable: false, value: null }); // ensure it overrides the prototype, but is not callable return testSymbolObject(objSym) && testSymbolObject(symNoToJSON);
}
§global symbol registry
?
function(){
var symbol = Symbol.for('foo'); return Symbol.for('foo') === symbol && Symbol.keyFor(symbol) === 'foo';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var symbol = Symbol.for('foo'); return Symbol.for('foo') === symbol && Symbol.keyFor(symbol) === 'foo';
}

well-known symbols

§Symbol.hasInstance
?
function(){
var passed = false; var obj = { foo: true }; var C = function(){}; Object.defineProperty(C, Symbol.hasInstance, { value: function(inst) { passed = inst.foo; return false; } }); obj instanceof C; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
var passed = false; var obj = { foo: true }; var C = function(){}; Object.defineProperty(C, Symbol.hasInstance, { value: function(inst) { passed = inst.foo; return false; } }); obj instanceof C; return passed;
}
§Symbol.isConcatSpreadable, non-spreadable array
?
function(){
var a = [], b = []; b[Symbol.isConcatSpreadable] = false; a = a.concat(b); return a[0] === b;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var a = [], b = []; b[Symbol.isConcatSpreadable] = false; a = a.concat(b); return a[0] === b;
}
§Symbol.isConcatSpreadable, spreadable object with poisoned getter
?
function(){
if (typeof Symbol !== 'function' || !Symbol.isConcatSpreadable) { return null; } var spreadableHasPoisonedIndex = { length: Math.pow(2, 53) - 1 }; spreadableHasPoisonedIndex[Symbol.isConcatSpreadable] = true; Object.defineProperty(spreadableHasPoisonedIndex, 0, { get: function () { throw new SyntaxError(); } }); try { [].concat(spreadableHasPoisonedIndex); return false; } catch (e) { return !!e && e.name === 'SyntaxError'; }
}
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
if (typeof Symbol !== 'function' || !Symbol.isConcatSpreadable) { return null; } var spreadableHasPoisonedIndex = { length: Math.pow(2, 53) - 1 }; spreadableHasPoisonedIndex[Symbol.isConcatSpreadable] = true; Object.defineProperty(spreadableHasPoisonedIndex, 0, { get: function () { throw new SyntaxError(); } }); try { [].concat(spreadableHasPoisonedIndex); return false; } catch (e) { return !!e && e.name === 'SyntaxError'; }
}
§Symbol.iterator, existence
?
function(){
return "iterator" in Symbol;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return "iterator" in Symbol;
}
§Symbol.iterator, arguments object
?
function(){
return (function() { return typeof arguments[Symbol.iterator] === 'function' && Object.hasOwnProperty.call(arguments, Symbol.iterator); }());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
return (function() { return typeof arguments[Symbol.iterator] === 'function' && Object.hasOwnProperty.call(arguments, Symbol.iterator); }());
}
§Symbol.species, existence
?
function(){
return "species" in Symbol;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
return "species" in Symbol;
}
§Symbol.species, Array.prototype.concat
?
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.concat.call(obj, []).foo === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.concat.call(obj, []).foo === 1;
}
§Symbol.species, Array.prototype.filter
?
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.filter.call(obj, Boolean).foo === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.filter.call(obj, Boolean).foo === 1;
}
§Symbol.species, Array.prototype.map
?
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.map.call(obj, Boolean).foo === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.map.call(obj, Boolean).foo === 1;
}
§Symbol.species, Array.prototype.slice
?
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.slice.call(obj, 0).foo === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.slice.call(obj, 0).foo === 1;
}
§Symbol.species, Array.prototype.splice
?
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.splice.call(obj, 0).foo === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
var obj = []; obj.constructor = {}; obj.constructor[Symbol.species] = function() { return { foo: 1 }; }; return Array.prototype.splice.call(obj, 0).foo === 1;
}
§Symbol.species, RegExp.prototype[Symbol.split]
?
function(){
var passed = false; var obj = { constructor: {} }; obj[Symbol.split] = RegExp.prototype[Symbol.split]; obj.constructor[Symbol.species] = function() { passed = true; return /./; }; "".split(obj); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
No
No
No
No
No
No
Error
Error
function(){
var passed = false; var obj = { constructor: {} }; obj[Symbol.split] = RegExp.prototype[Symbol.split]; obj.constructor[Symbol.species] = function() { passed = true; return /./; }; "".split(obj); return passed;
}
§Symbol.species, Promise.prototype.then
?
function(){
var promise = new Promise(function(resolve){ resolve(42); }); var FakePromise1 = promise.constructor = function(exec){ exec(function(){}, function(){}); }; var FakePromise2 = function(exec){ exec(function(){}, function(){}); }; Object.defineProperty(FakePromise1, Symbol.species, {value: FakePromise2}); return promise.then(function(){}) instanceof FakePromise2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
Error
Error
function(){
var promise = new Promise(function(resolve){ resolve(42); }); var FakePromise1 = promise.constructor = function(exec){ exec(function(){}, function(){}); }; var FakePromise2 = function(exec){ exec(function(){}, function(){}); }; Object.defineProperty(FakePromise1, Symbol.species, {value: FakePromise2}); return promise.then(function(){}) instanceof FakePromise2;
}
§Symbol.replace
?
function(){
var O = {}; O[Symbol.replace] = function(){ return 42; }; return ''.replace(O) === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var O = {}; O[Symbol.replace] = function(){ return 42; }; return ''.replace(O) === 42;
}
§Symbol.search
?
function(){
var O = {}; O[Symbol.search] = function(){ return 42; }; return ''.search(O) === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var O = {}; O[Symbol.search] = function(){ return 42; }; return ''.search(O) === 42;
}
§Symbol.split
?
function(){
var O = {}; O[Symbol.split] = function(){ return 42; }; return ''.split(O) === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var O = {}; O[Symbol.split] = function(){ return 42; }; return ''.split(O) === 42;
}
§Symbol.match
?
function(){
var O = {}; O[Symbol.match] = function(){ return 42; }; return ''.match(O) === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var O = {}; O[Symbol.match] = function(){ return 42; }; return ''.match(O) === 42;
}
§Symbol.match, RegExp constructor
?
function(){
var re = /./; re[Symbol.match] = false; var foo = {constructor: RegExp}; foo[Symbol.match] = true; return RegExp(re) !== re && RegExp(foo) === foo;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var re = /./; re[Symbol.match] = false; var foo = {constructor: RegExp}; foo[Symbol.match] = true; return RegExp(re) !== re && RegExp(foo) === foo;
}
§Symbol.match, String.prototype.startsWith
?
function(){
var re = /./; try { '/./'.startsWith(re); } catch(e){ re[Symbol.match] = false; return '/./'.startsWith(re); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var re = /./; try { '/./'.startsWith(re); } catch(e){ re[Symbol.match] = false; return '/./'.startsWith(re); }
}
§Symbol.match, String.prototype.endsWith
?
function(){
var re = /./; try { '/./'.endsWith(re); } catch(e){ re[Symbol.match] = false; return '/./'.endsWith(re); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var re = /./; try { '/./'.endsWith(re); } catch(e){ re[Symbol.match] = false; return '/./'.endsWith(re); }
}
§Symbol.match, String.prototype.includes
?
function(){
var re = /./; try { '/./'.includes(re); } catch(e){ re[Symbol.match] = false; return '/./'.includes(re); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var re = /./; try { '/./'.includes(re); } catch(e){ re[Symbol.match] = false; return '/./'.includes(re); }
}
§Symbol.toPrimitive
?
function(){
var a = {}, b = {}, c = {}; var passed = 0; a[Symbol.toPrimitive] = function(hint) { passed += hint === "number"; return 0; }; b[Symbol.toPrimitive] = function(hint) { passed += hint === "string"; return 0; }; c[Symbol.toPrimitive] = function(hint) { passed += hint === "default"; return 0; }; a >= 0; b in {}; c == 0; // eslint-disable-line eqeqeq return passed === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
var a = {}, b = {}, c = {}; var passed = 0; a[Symbol.toPrimitive] = function(hint) { passed += hint === "number"; return 0; }; b[Symbol.toPrimitive] = function(hint) { passed += hint === "string"; return 0; }; c[Symbol.toPrimitive] = function(hint) { passed += hint === "default"; return 0; }; a >= 0; b in {}; c == 0; // eslint-disable-line eqeqeq return passed === 3;
}
§Symbol.toStringTag
?
function(){
var a = {}; a[Symbol.toStringTag] = "foo"; return (a + "") === "[object foo]";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
No
Error
Error
function(){
var a = {}; a[Symbol.toStringTag] = "foo"; return (a + "") === "[object foo]";
}
§Symbol.toStringTag affects existing built-ins
?
function(){
var s = Symbol.toStringTag; var passed = true; [ [Array.prototype, []], [String.prototype, ''], [arguments, arguments], [Function.prototype, function(){}], [Error.prototype, new Error()], [Boolean.prototype, true], [Number.prototype, 2], [Date.prototype, new Date()], [RegExp.prototype, /./] ].forEach(function(pair){ pair[0][s] = "foo"; passed &= (Object.prototype.toString.call(pair[1]) === "[object foo]"); delete pair[0][s]; }); return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
No
Error
Error
function(){
var s = Symbol.toStringTag; var passed = true; [ [Array.prototype, []], [String.prototype, ''], [arguments, arguments], [Function.prototype, function(){}], [Error.prototype, new Error()], [Boolean.prototype, true], [Number.prototype, 2], [Date.prototype, new Date()], [RegExp.prototype, /./] ].forEach(function(pair){ pair[0][s] = "foo"; passed &= (Object.prototype.toString.call(pair[1]) === "[object foo]"); delete pair[0][s]; }); return passed;
}
§Symbol.toStringTag, new built-ins
?
function(){
var passed = true; var s = Symbol.toStringTag; [ [String, "String Iterator"], [Array, "Array Iterator"], [Map, "Map Iterator"], [Set, "Set Iterator"] ].forEach(function(pair){ var iterProto = Object.getPrototypeOf(new pair[0]()[Symbol.iterator]()); passed = passed && iterProto.hasOwnProperty(s) && iterProto[s] === pair[1]; }); passed = passed && Object.getPrototypeOf(function*(){})[s] === "GeneratorFunction" && Object.getPrototypeOf(function*(){}())[s] === "Generator" && Map.prototype[s] === "Map" && Set.prototype[s] === "Set" && ArrayBuffer.prototype[s] === "ArrayBuffer" && DataView.prototype[s] === "DataView" && Promise.prototype[s] === "Promise" && Symbol.prototype[s] === "Symbol" && typeof Object.getOwnPropertyDescriptor( Object.getPrototypeOf(Int8Array).prototype, Symbol.toStringTag).get === "function"; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Error
No
Error
Error
No
Error
Error
function(){
var passed = true; var s = Symbol.toStringTag; [ [String, "String Iterator"], [Array, "Array Iterator"], [Map, "Map Iterator"], [Set, "Set Iterator"] ].forEach(function(pair){ var iterProto = Object.getPrototypeOf(new pair[0]()[Symbol.iterator]()); passed = passed && iterProto.hasOwnProperty(s) && iterProto[s] === pair[1]; }); passed = passed && Object.getPrototypeOf(function*(){})[s] === "GeneratorFunction" && Object.getPrototypeOf(function*(){}())[s] === "Generator" && Map.prototype[s] === "Map" && Set.prototype[s] === "Set" && ArrayBuffer.prototype[s] === "ArrayBuffer" && DataView.prototype[s] === "DataView" && Promise.prototype[s] === "Promise" && Symbol.prototype[s] === "Symbol" && typeof Object.getOwnPropertyDescriptor( Object.getPrototypeOf(Int8Array).prototype, Symbol.toStringTag).get === "function"; return passed;
}
§Symbol.toStringTag, misc. built-ins
?
function(){
var s = Symbol.toStringTag; return Math[s] === "Math" && JSON[s] === "JSON";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
No
Error
Error
function(){
var s = Symbol.toStringTag; return Math[s] === "Math" && JSON[s] === "JSON";
}
§Symbol.unscopables
?
function(){
var a = { foo: 1, bar: 2 }; a[Symbol.unscopables] = { bar: true }; with (a) { return foo === 1 && typeof bar === "undefined"; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var a = { foo: 1, bar: 2 }; a[Symbol.unscopables] = { bar: true }; with (a) { return foo === 1 && typeof bar === "undefined"; }
}

built-in extensions

Object static methods

§Object.assign
?
function(){
var o = Object.assign({a:true}, {b:true}, {c:true}); return "a" in o && "b" in o && "c" in o;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var o = Object.assign({a:true}, {b:true}, {c:true}); return "a" in o && "b" in o && "c" in o;
}
§Object.is
?
function(){
return typeof Object.is === 'function' && Object.is(NaN, NaN) && !Object.is(-0, 0);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return typeof Object.is === 'function' && Object.is(NaN, NaN) && !Object.is(-0, 0);
}
§Object.getOwnPropertySymbols
?
function(){
var o = {}; var sym = Symbol(), sym2 = Symbol(), sym3 = Symbol(); o[sym] = true; o[sym2] = true; o[sym3] = true; var result = Object.getOwnPropertySymbols(o); return result[0] === sym && result[1] === sym2 && result[2] === sym3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var o = {}; var sym = Symbol(), sym2 = Symbol(), sym3 = Symbol(); o[sym] = true; o[sym2] = true; o[sym3] = true; var result = Object.getOwnPropertySymbols(o); return result[0] === sym && result[1] === sym2 && result[2] === sym3;
}
§Object.setPrototypeOf
?
function(){
return Object.setPrototypeOf({}, Array.prototype) instanceof Array;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return Object.setPrototypeOf({}, Array.prototype) instanceof Array;
}

function "name" property

§function statements
?
function(){
function foo(){}; return foo.name === 'foo' && (function(){}).name === '';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
function foo(){}; return foo.name === 'foo' && (function(){}).name === '';
}
§function expressions
?
function(){
return (function foo(){}).name === 'foo' && (function(){}).name === '';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return (function foo(){}).name === 'foo' && (function(){}).name === '';
}
§new Function
?
function(){
return (new Function).name === "anonymous";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
return (new Function).name === "anonymous";
}
§bound functions
?
function(){
function foo() {}; return foo.bind({}).name === "bound foo" && (function(){}).bind({}).name === "bound ";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
function foo() {}; return foo.bind({}).name === "bound foo" && (function(){}).bind({}).name === "bound ";
}
§variables (function)
?
function(){
var foo = function() {}; var bar = function baz() {}; return foo.name === "foo" && bar.name === "baz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
function(){
var foo = function() {}; var bar = function baz() {}; return foo.name === "foo" && bar.name === "baz";
}
§object methods (function)
?
function(){
var o = { foo: function(){}, bar: function baz(){}}; o.qux = function(){}; return o.foo.name === "foo" && o.bar.name === "baz" && o.qux.name === "";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
function(){
var o = { foo: function(){}, bar: function baz(){}}; o.qux = function(){}; return o.foo.name === "foo" && o.bar.name === "baz" && o.qux.name === "";
}
§accessor properties
?
function(){
var o = { get foo(){}, set foo(x){} }; var descriptor = Object.getOwnPropertyDescriptor(o, "foo"); return descriptor.get.name === "get foo" && descriptor.set.name === "set foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
function(){
var o = { get foo(){}, set foo(x){} }; var descriptor = Object.getOwnPropertyDescriptor(o, "foo"); return descriptor.get.name === "get foo" && descriptor.set.name === "set foo";
}
§shorthand methods
?
function(){
var o = { foo(){} }; return o.foo.name === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var o = { foo(){} }; return o.foo.name === "foo";
}
§shorthand methods (no lexical binding)
?
function(){
var f = "foo"; return ({f() { return f; }}).f() === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var f = "foo"; return ({f() { return f; }}).f() === "foo";
}
§symbol-keyed methods
?
function(){
var sym1 = Symbol("foo"); var sym2 = Symbol(); var o = { [sym1]: function(){}, [sym2]: function(){} }; return o[sym1].name === "[foo]" && o[sym2].name === "";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
Error
Error
Error
Error
function(){
var sym1 = Symbol("foo"); var sym2 = Symbol(); var o = { [sym1]: function(){}, [sym2]: function(){} }; return o[sym1].name === "[foo]" && o[sym2].name === "";
}
§class statements
?
function(){
class foo {}; class bar { static name() {} }; return foo.name === "foo" && typeof bar.name === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class foo {}; class bar { static name() {} }; return foo.name === "foo" && typeof bar.name === "function";
}
§class expressions
?
function(){
return class foo {}.name === "foo" && typeof class bar { static name() {} }.name === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
return class foo {}.name === "foo" && typeof class bar { static name() {} }.name === "function";
}
§variables (class)
?
function(){
var foo = class {}; var bar = class baz {}; var qux = class { static name() {} }; return foo.name === "foo" && bar.name === "baz" && typeof qux.name === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
No
Error
Error
Error
Error
Error
Error
function(){
var foo = class {}; var bar = class baz {}; var qux = class { static name() {} }; return foo.name === "foo" && bar.name === "baz" && typeof qux.name === "function";
}
§object methods (class)
?
function(){
var o = { foo: class {}, bar: class baz {}}; o.qux = class {}; return o.foo.name === "foo" && o.bar.name === "baz" && o.qux.name === "";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
No
Error
Error
Error
Error
Error
Error
function(){
var o = { foo: class {}, bar: class baz {}}; o.qux = class {}; return o.foo.name === "foo" && o.bar.name === "baz" && o.qux.name === "";
}
§class prototype methods
?
function(){
class C { foo(){} }; return (new C).foo.name === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { foo(){} }; return (new C).foo.name === "foo";
}
§class static methods
?
function(){
class C { static foo(){} }; return C.foo.name === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C { static foo(){} }; return C.foo.name === "foo";
}
§isn't writable, is configurable
?
function(){
var descriptor = Object.getOwnPropertyDescriptor(function f(){},"name"); return descriptor.enumerable === false && descriptor.writable === false && descriptor.configurable === true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
var descriptor = Object.getOwnPropertyDescriptor(function f(){},"name"); return descriptor.enumerable === false && descriptor.writable === false && descriptor.configurable === true;
}

String static methods

§String.raw
?
function(){
return typeof String.raw === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof String.raw === 'function';
}
§String.fromCodePoint
?
function(){
return typeof String.fromCodePoint === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return typeof String.fromCodePoint === 'function';
}

String.prototype methods

§String.prototype.codePointAt
?
function(){
return typeof String.prototype.codePointAt === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return typeof String.prototype.codePointAt === 'function';
}
§String.prototype.normalize
?
function(){
return typeof String.prototype.normalize === "function" && "c\u0327\u0301".normalize("NFC") === "\u1e09" && "\u1e09".normalize("NFD") === "c\u0327\u0301";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof String.prototype.normalize === "function" && "c\u0327\u0301".normalize("NFC") === "\u1e09" && "\u1e09".normalize("NFD") === "c\u0327\u0301";
}
§String.prototype.repeat
?
function(){
return typeof String.prototype.repeat === 'function' && "foo".repeat(3) === "foofoofoo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return typeof String.prototype.repeat === 'function' && "foo".repeat(3) === "foofoofoo";
}
§String.prototype.startsWith
?
function(){
return typeof String.prototype.startsWith === 'function' && "foobar".startsWith("foo");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return typeof String.prototype.startsWith === 'function' && "foobar".startsWith("foo");
}
§String.prototype.startsWith throws on RegExp
?
function(){
try { "a".startsWith(/./); } catch(e) { return typeof String.prototype.startsWith === 'function'; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
try { "a".startsWith(/./); } catch(e) { return typeof String.prototype.startsWith === 'function'; }
}
§String.prototype.endsWith
?
function(){
return typeof String.prototype.endsWith === 'function' && "foobar".endsWith("bar");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return typeof String.prototype.endsWith === 'function' && "foobar".endsWith("bar");
}
§String.prototype.endsWith throws on RegExp
?
function(){
try { "a".endsWith(/./); } catch(e) { return typeof String.prototype.endsWith === 'function'; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
try { "a".endsWith(/./); } catch(e) { return typeof String.prototype.endsWith === 'function'; }
}
§String.prototype.includes
?
function(){
return typeof String.prototype.includes === 'function' && "foobar".includes("oba");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof String.prototype.includes === 'function' && "foobar".includes("oba");
}
§String.prototype[Symbol.iterator]
?
function(){
return typeof String.prototype[Symbol.iterator] === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return typeof String.prototype[Symbol.iterator] === 'function';
}
§String iterator prototype chain
?
function(){
// Iterator instance var iterator = ''[Symbol.iterator](); // %StringIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1); return proto2.hasOwnProperty(Symbol.iterator) && !proto1 .hasOwnProperty(Symbol.iterator) && !iterator .hasOwnProperty(Symbol.iterator) && iterator[Symbol.iterator]() === iterator;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
function(){
// Iterator instance var iterator = ''[Symbol.iterator](); // %StringIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1); return proto2.hasOwnProperty(Symbol.iterator) && !proto1 .hasOwnProperty(Symbol.iterator) && !iterator .hasOwnProperty(Symbol.iterator) && iterator[Symbol.iterator]() === iterator;
}

RegExp.prototype properties

§RegExp.prototype.flags
?
function(){
return /./igm.flags === "gim" && /./.flags === "";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
return /./igm.flags === "gim" && /./.flags === "";
}
§RegExp.prototype[Symbol.match]
?
function(){
return typeof RegExp.prototype[Symbol.match] === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
return typeof RegExp.prototype[Symbol.match] === 'function';
}
§RegExp.prototype[Symbol.replace]
?
function(){
return typeof RegExp.prototype[Symbol.replace] === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
return typeof RegExp.prototype[Symbol.replace] === 'function';
}
§RegExp.prototype[Symbol.split]
?
function(){
return typeof RegExp.prototype[Symbol.split] === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
return typeof RegExp.prototype[Symbol.split] === 'function';
}
§RegExp.prototype[Symbol.search]
?
function(){
return typeof RegExp.prototype[Symbol.search] === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
function(){
return typeof RegExp.prototype[Symbol.search] === 'function';
}
§RegExp[Symbol.species]
?
function(){
var prop = Object.getOwnPropertyDescriptor(RegExp, Symbol.species); return 'get' in prop && RegExp[Symbol.species] === RegExp;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var prop = Object.getOwnPropertyDescriptor(RegExp, Symbol.species); return 'get' in prop && RegExp[Symbol.species] === RegExp;
}

Array static methods

§Array.from, array-like objects
?
function(){
return Array.from({ 0: "foo", 1: "bar", length: 2 }) + '' === "foo,bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Array.from({ 0: "foo", 1: "bar", length: 2 }) + '' === "foo,bar";
}
§Array.from, generator instances
?
function(){
var iterable = (function*(){ yield 1; yield 2; yield 3; }()); return Array.from(iterable) + '' === "1,2,3";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var iterable = (function*(){ yield 1; yield 2; yield 3; }()); return Array.from(iterable) + '' === "1,2,3";
}
§Array.from, generic iterables
?
function(){
var iterable = global.__createIterableObject([1, 2, 3]); return Array.from(iterable) + '' === "1,2,3";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var iterable = global.__createIterableObject([1, 2, 3]); return Array.from(iterable) + '' === "1,2,3";
}
§Array.from, instances of generic iterables
?
function(){
var iterable = global.__createIterableObject([1, 2, 3]); return Array.from(Object.create(iterable)) + '' === "1,2,3";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var iterable = global.__createIterableObject([1, 2, 3]); return Array.from(Object.create(iterable)) + '' === "1,2,3";
}
§Array.from map function, array-like objects
?
function(){
return Array.from({ 0: "foo", 1: "bar", length: 2 }, function(e, i) { return e + this.baz + i; }, { baz: "d" }) + '' === "food0,bard1";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Array.from({ 0: "foo", 1: "bar", length: 2 }, function(e, i) { return e + this.baz + i; }, { baz: "d" }) + '' === "food0,bard1";
}
§Array.from map function, generator instances
?
function(){
var iterable = (function*(){ yield "foo"; yield "bar"; yield "bal"; }()); return Array.from(iterable, function(e, i) { return e + this.baz + i; }, { baz: "d" }) + '' === "food0,bard1,bald2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var iterable = (function*(){ yield "foo"; yield "bar"; yield "bal"; }()); return Array.from(iterable, function(e, i) { return e + this.baz + i; }, { baz: "d" }) + '' === "food0,bard1,bald2";
}
§Array.from map function, generic iterables
?
function(){
var iterable = global.__createIterableObject(["foo", "bar", "bal"]); return Array.from(iterable, function(e, i) { return e + this.baz + i; }, { baz: "d" }) + '' === "food0,bard1,bald2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var iterable = global.__createIterableObject(["foo", "bar", "bal"]); return Array.from(iterable, function(e, i) { return e + this.baz + i; }, { baz: "d" }) + '' === "food0,bard1,bald2";
}
§Array.from map function, instances of iterables
?
function(){
var iterable = global.__createIterableObject(["foo", "bar", "bal"]); return Array.from(Object.create(iterable), function(e, i) { return e + this.baz + i; }, { baz: "d" }) + '' === "food0,bard1,bald2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var iterable = global.__createIterableObject(["foo", "bar", "bal"]); return Array.from(Object.create(iterable), function(e, i) { return e + this.baz + i; }, { baz: "d" }) + '' === "food0,bard1,bald2";
}
§Array.from, iterator closing
?
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { Array.from(iter, function() { throw 42 }); } catch(e){} return closed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
function(){
var closed = false; var iter = global.__createIterableObject([1, 2, 3], { 'return': function(){ closed = true; return {}; } }); try { Array.from(iter, function() { throw 42 }); } catch(e){} return closed;
}
§Array.of
?
function(){
return typeof Array.of === 'function' && Array.of(2)[0] === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Array.of === 'function' && Array.of(2)[0] === 2;
}
§Array[Symbol.species]
?
function(){
var prop = Object.getOwnPropertyDescriptor(Array, Symbol.species); return 'get' in prop && Array[Symbol.species] === Array;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var prop = Object.getOwnPropertyDescriptor(Array, Symbol.species); return 'get' in prop && Array[Symbol.species] === Array;
}

Array.prototype methods

§Array.prototype.copyWithin
?
function(){
return typeof Array.prototype.copyWithin === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
return typeof Array.prototype.copyWithin === 'function';
}
§Array.prototype.find
?
function(){
return typeof Array.prototype.find === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return typeof Array.prototype.find === 'function';
}
§Array.prototype.findIndex
?
function(){
return typeof Array.prototype.findIndex === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return typeof Array.prototype.findIndex === 'function';
}
§Array.prototype.fill
?
function(){
return typeof Array.prototype.fill === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
function(){
return typeof Array.prototype.fill === 'function';
}
§Array.prototype.keys
?
function(){
return typeof Array.prototype.keys === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Array.prototype.keys === 'function';
}
§Array.prototype.values
?
function(){
return typeof Array.prototype.values === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Yes
Yes
No
No
function(){
return typeof Array.prototype.values === 'function';
}
§Array.prototype.entries
?
function(){
return typeof Array.prototype.entries === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Array.prototype.entries === 'function';
}
§Array.prototype.splice
?
function(){
if ([0, 1, 2].splice(0).length !== 3) { // IE <= 8 and other pre-ES6 engines fail this check return false; } var a = [1, 2]; var result = a.splice(); if (a.length !== 2 || result.length !== 0) { // Safari 5.0 has this bug return false; } var obj = {}; Array.prototype.splice.call(obj, 0, 0, 1); if (obj.length !== 1) { return false; } var spliceWorksWithLargeSparseArrays = (function () { // Per https://github.com/es-shims/es5-shim/issues/295 // Safari 7/8 breaks with sparse arrays of size 1e5 or greater var arr = new Array(1e5); // note: the index MUST be 8 or larger or the test will false pass arr[8] = 'x'; arr.splice(1, 1); for (var i = 0; i < arr.length; i += 1) { if (arr[i] === 'x') { return i === 7; } } return false; }()); var spliceWorksWithSmallSparseArrays = (function () { // Per https://github.com/es-shims/es5-shim/issues/295 // Opera 12.15 breaks on this, no idea why. var n = 256; var arr = []; arr[n] = 'a'; arr.splice(n + 1, 0, 'b'); return arr[n] === 'a'; }()); return spliceWorksWithLargeSparseArrays && spliceWorksWithSmallSparseArrays;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
if ([0, 1, 2].splice(0).length !== 3) { // IE <= 8 and other pre-ES6 engines fail this check return false; } var a = [1, 2]; var result = a.splice(); if (a.length !== 2 || result.length !== 0) { // Safari 5.0 has this bug return false; } var obj = {}; Array.prototype.splice.call(obj, 0, 0, 1); if (obj.length !== 1) { return false; } var spliceWorksWithLargeSparseArrays = (function () { // Per https://github.com/es-shims/es5-shim/issues/295 // Safari 7/8 breaks with sparse arrays of size 1e5 or greater var arr = new Array(1e5); // note: the index MUST be 8 or larger or the test will false pass arr[8] = 'x'; arr.splice(1, 1); for (var i = 0; i < arr.length; i += 1) { if (arr[i] === 'x') { return i === 7; } } return false; }()); var spliceWorksWithSmallSparseArrays = (function () { // Per https://github.com/es-shims/es5-shim/issues/295 // Opera 12.15 breaks on this, no idea why. var n = 256; var arr = []; arr[n] = 'a'; arr.splice(n + 1, 0, 'b'); return arr[n] === 'a'; }()); return spliceWorksWithLargeSparseArrays && spliceWorksWithSmallSparseArrays;
}
§Array.prototype[Symbol.iterator]
?
function(){
return typeof Array.prototype[Symbol.iterator] === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return typeof Array.prototype[Symbol.iterator] === 'function';
}
§Array iterator prototype chain
?
function(){
// Iterator instance var iterator = [][Symbol.iterator](); // %ArrayIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1); return proto2.hasOwnProperty(Symbol.iterator) && !proto1 .hasOwnProperty(Symbol.iterator) && !iterator .hasOwnProperty(Symbol.iterator) && iterator[Symbol.iterator]() === iterator;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
Error
Error
function(){
// Iterator instance var iterator = [][Symbol.iterator](); // %ArrayIteratorPrototype% var proto1 = Object.getPrototypeOf(iterator); // %IteratorPrototype% var proto2 = Object.getPrototypeOf(proto1); return proto2.hasOwnProperty(Symbol.iterator) && !proto1 .hasOwnProperty(Symbol.iterator) && !iterator .hasOwnProperty(Symbol.iterator) && iterator[Symbol.iterator]() === iterator;
}
§Array.prototype[Symbol.unscopables]
?
function(){
var unscopables = Array.prototype[Symbol.unscopables]; if (!unscopables) { return false; } var ns = "find,findIndex,fill,copyWithin,entries,keys,values".split(","); for (var i = 0; i < ns.length; i++) { if (Array.prototype[ns[i]] && !unscopables[ns[i]]) return false; } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var unscopables = Array.prototype[Symbol.unscopables]; if (!unscopables) { return false; } var ns = "find,findIndex,fill,copyWithin,entries,keys,values".split(","); for (var i = 0; i < ns.length; i++) { if (Array.prototype[ns[i]] && !unscopables[ns[i]]) return false; } return true;
}

Number properties

§Number.isFinite
?
function(){
return typeof Number.isFinite === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return typeof Number.isFinite === 'function';
}
§Number.isInteger
?
function(){
return typeof Number.isInteger === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Number.isInteger === 'function';
}
§Number.isSafeInteger
?
function(){
return typeof Number.isSafeInteger === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Number.isSafeInteger === 'function';
}
§Number.isNaN
?
function(){
return typeof Number.isNaN === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return typeof Number.isNaN === 'function';
}
§Number.parseFloat
?
function(){
var actualGlobal = Function('return this')(); return typeof Number.parseFloat === 'function' && Number.parseFloat === actualGlobal.parseFloat;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
var actualGlobal = Function('return this')(); return typeof Number.parseFloat === 'function' && Number.parseFloat === actualGlobal.parseFloat;
}
§Number.parseInt
?
function(){
var actualGlobal = Function('return this')(); return typeof Number.parseInt === 'function' && Number.parseInt === actualGlobal.parseInt;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
var actualGlobal = Function('return this')(); return typeof Number.parseInt === 'function' && Number.parseInt === actualGlobal.parseInt;
}
§Number.EPSILON
?
function(){
return typeof Number.EPSILON === 'number';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Number.EPSILON === 'number';
}
§Number.MIN_SAFE_INTEGER
?
function(){
return typeof Number.MIN_SAFE_INTEGER === 'number';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Number.MIN_SAFE_INTEGER === 'number';
}
§Number.MAX_SAFE_INTEGER
?
function(){
return typeof Number.MAX_SAFE_INTEGER === 'number';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Number.MAX_SAFE_INTEGER === 'number';
}

Math methods

§Math.clz32
?
function(){
return typeof Math.clz32 === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.clz32 === "function";
}
§Math.imul
?
function(){
return typeof Math.imul === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.imul === "function";
}
§Math.sign
?
function(){
return typeof Math.sign === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.sign === "function";
}
§Math.log10
?
function(){
return typeof Math.log10 === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.log10 === "function";
}
§Math.log2
?
function(){
return typeof Math.log2 === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.log2 === "function";
}
§Math.log1p
?
function(){
return typeof Math.log1p === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.log1p === "function";
}
§Math.expm1
?
function(){
return typeof Math.expm1 === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.expm1 === "function";
}
§Math.cosh
?
function(){
return typeof Math.cosh === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.cosh === "function";
}
§Math.sinh
?
function(){
return typeof Math.sinh === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.sinh === "function";
}
§Math.tanh
?
function(){
return typeof Math.tanh === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.tanh === "function";
}
§Math.acosh
?
function(){
return typeof Math.acosh === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.acosh === "function";
}
§Math.asinh
?
function(){
return typeof Math.asinh === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.asinh === "function";
}
§Math.atanh
?
function(){
return typeof Math.atanh === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.atanh === "function";
}
§Math.trunc
?
function(){
return typeof Math.trunc === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.trunc === "function";
}
§Math.fround
?
function(){
return typeof Math.fround === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.fround === "function";
}
§Math.cbrt
?
function(){
return typeof Math.cbrt === "function";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return typeof Math.cbrt === "function";
}
§Math.hypot
?
function(){
return Math.hypot() === 0 && Math.hypot(1) === 1 && Math.hypot(9, 12, 20) === 25 && Math.hypot(27, 36, 60, 100) === 125;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
return Math.hypot() === 0 && Math.hypot(1) === 1 && Math.hypot(9, 12, 20) === 25 && Math.hypot(27, 36, 60, 100) === 125;
}

§Date.prototype[Symbol.toPrimitive]
?
function(){
var tp = Date.prototype[Symbol.toPrimitive]; return tp.call(Object(2), "number") === 2 && tp.call(Object(2), "string") === "2" && tp.call(Object(2), "default") === "2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var tp = Date.prototype[Symbol.toPrimitive]; return tp.call(Object(2), "number") === 2 && tp.call(Object(2), "string") === "2" && tp.call(Object(2), "default") === "2";
}

subclassing

Array is subclassable

§length property (accessing)
?
function(){
class C extends Array {} var c = new C(); var len1 = c.length; c[2] = 'foo'; var len2 = c.length; return len1 === 0 && len2 === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} var c = new C(); var len1 = c.length; c[2] = 'foo'; var len2 = c.length; return len1 === 0 && len2 === 3;
}
§length property (setting)
?
function(){
class C extends Array {} var c = new C(); c[2] = 'foo'; c.length = 1; return c.length === 1 && !(2 in c);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} var c = new C(); c[2] = 'foo'; c.length = 1; return c.length === 1 && !(2 in c);
}
§correct prototype chain
?
function(){
class C extends Array {} var c = new C(); return c instanceof C && c instanceof Array && Object.getPrototypeOf(C) === Array;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} var c = new C(); return c instanceof C && c instanceof Array && Object.getPrototypeOf(C) === Array;
}
§Array.isArray support
?
function(){
class C extends Array {} return Array.isArray(new C());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} return Array.isArray(new C());
}
§Array.prototype.concat
?
function(){
class C extends Array {} var c = new C(); return c.concat(1) instanceof C;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
No
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} var c = new C(); return c.concat(1) instanceof C;
}
§Array.prototype.filter
?
function(){
class C extends Array {} var c = new C(); return c.filter(Boolean) instanceof C;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
No
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} var c = new C(); return c.filter(Boolean) instanceof C;
}
§Array.prototype.map
?
function(){
class C extends Array {} var c = new C(); return c.map(Boolean) instanceof C;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
No
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} var c = new C(); return c.map(Boolean) instanceof C;
}
§Array.prototype.slice
?
function(){
class C extends Array {} var c = new C(); c.push(2,4,6); return c.slice(1,2) instanceof C;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
No
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} var c = new C(); c.push(2,4,6); return c.slice(1,2) instanceof C;
}
§Array.prototype.splice
?
function(){
class C extends Array {} var c = new C(); c.push(2,4,6); return c.splice(1,2) instanceof C;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
No
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} var c = new C(); c.push(2,4,6); return c.splice(1,2) instanceof C;
}
§Array.from
?
function(){
class C extends Array {} return C.from({ length: 0 }) instanceof C;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} return C.from({ length: 0 }) instanceof C;
}
§Array.of
?
function(){
class C extends Array {} return C.of(0) instanceof C;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Array {} return C.of(0) instanceof C;
}

RegExp is subclassable

§basic functionality
?
function(){
class R extends RegExp {} var r = new R("baz","g"); return r.global && r.source === "baz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class R extends RegExp {} var r = new R("baz","g"); return r.global && r.source === "baz";
}
§correct prototype chain
?
function(){
class R extends RegExp {} var r = new R("baz","g"); return r instanceof R && r instanceof RegExp && Object.getPrototypeOf(R) === RegExp;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class R extends RegExp {} var r = new R("baz","g"); return r instanceof R && r instanceof RegExp && Object.getPrototypeOf(R) === RegExp;
}
§RegExp.prototype.exec
?
function(){
class R extends RegExp {} var r = new R("baz","g"); return r.exec("foobarbaz")[0] === "baz" && r.lastIndex === 9;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class R extends RegExp {} var r = new R("baz","g"); return r.exec("foobarbaz")[0] === "baz" && r.lastIndex === 9;
}
§RegExp.prototype.test
?
function(){
class R extends RegExp {} var r = new R("baz"); return r.test("foobarbaz");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class R extends RegExp {} var r = new R("baz"); return r.test("foobarbaz");
}

Function is subclassable

§can be called
?
function(){
class C extends Function {} var c = new C("return 'foo';"); return c() === 'foo';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Function {} var c = new C("return 'foo';"); return c() === 'foo';
}
§correct prototype chain
?
function(){
class C extends Function {} var c = new C("return 'foo';"); return c instanceof C && c instanceof Function && Object.getPrototypeOf(C) === Function;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
Error
Error
Error
Error
function(){
class C extends Function {} var c = new C("return 'foo';"); return c instanceof C && c instanceof Function && Object.getPrototypeOf(C) === Function;
}
§can be used with "new"
?
function(){
class C extends Function {} var c = new C("this.bar = 2;"); c.prototype.baz = 3; return new c().bar === 2 && new c().baz === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Function {} var c = new C("this.bar = 2;"); c.prototype.baz = 3; return new c().bar === 2 && new c().baz === 3;
}
§Function.prototype.call
?
function(){
class C extends Function {} var c = new C("x", "return this.bar + x;"); return c.call({bar:1}, 2) === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Function {} var c = new C("x", "return this.bar + x;"); return c.call({bar:1}, 2) === 3;
}
§Function.prototype.apply
?
function(){
class C extends Function {} var c = new C("x", "return this.bar + x;"); return c.apply({bar:1}, [2]) === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Function {} var c = new C("x", "return this.bar + x;"); return c.apply({bar:1}, [2]) === 3;
}
§Function.prototype.bind
?
function(){
class C extends Function {} var c = new C("x", "y", "return this.bar + x + y;").bind({bar:1}, 2); return c(6) === 9 && c instanceof C;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
Error
Error
Error
Error
function(){
class C extends Function {} var c = new C("x", "y", "return this.bar + x + y;").bind({bar:1}, 2); return c(6) === 9 && c instanceof C;
}

Promise is subclassable

§basic functionality
?
function(){
class P extends Promise {} var p1 = new P(function(resolve, reject) { resolve("foo"); }); var p2 = new P(function(resolve, reject) { reject("quux"); }); var score = +(p1 instanceof P); function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "quux"); check(); } function shouldNotRun(result) { score = -Infinity; } p1.then(thenFn, shouldNotRun); p2.then(shouldNotRun, catchFn); p1.catch(shouldNotRun); p2.catch(catchFn); p1.then(function() { // P.prototype.then() should return a new P score += p1.then() instanceof P && p1.then() !== p1; check(); }); function check() { if (score === 5) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class P extends Promise {} var p1 = new P(function(resolve, reject) { resolve("foo"); }); var p2 = new P(function(resolve, reject) { reject("quux"); }); var score = +(p1 instanceof P); function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "quux"); check(); } function shouldNotRun(result) { score = -Infinity; } p1.then(thenFn, shouldNotRun); p2.then(shouldNotRun, catchFn); p1.catch(shouldNotRun); p2.catch(catchFn); p1.then(function() { // P.prototype.then() should return a new P score += p1.then() instanceof P && p1.then() !== p1; check(); }); function check() { if (score === 5) asyncTestPassed(); }
}
§correct prototype chain
?
function(){
class C extends Promise {} var c = new C(function(resolve, reject) { resolve("foo"); }); return c instanceof C && c instanceof Promise && Object.getPrototypeOf(C) === Promise;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Promise {} var c = new C(function(resolve, reject) { resolve("foo"); }); return c instanceof C && c instanceof Promise && Object.getPrototypeOf(C) === Promise;
}
§Promise.all
?
function(){
class P extends Promise {} var fulfills = P.all([ new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }), new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }) ]); var rejects = P.all([ new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }), new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }) ]); var score = +(fulfills instanceof P); fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); }); rejects.catch(function(result) { score += (result === "qux"); check(); }); function check() { if (score === 3) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class P extends Promise {} var fulfills = P.all([ new Promise(function(resolve) { setTimeout(resolve,2000,"foo"); }), new Promise(function(resolve) { setTimeout(resolve,1000,"bar"); }) ]); var rejects = P.all([ new Promise(function(_, reject) { setTimeout(reject, 2000,"baz"); }), new Promise(function(_, reject) { setTimeout(reject, 1000,"qux"); }) ]); var score = +(fulfills instanceof P); fulfills.then(function(result) { score += (result + "" === "foo,bar"); check(); }); rejects.catch(function(result) { score += (result === "qux"); check(); }); function check() { if (score === 3) asyncTestPassed(); }
}
§Promise.race
?
function(){
class P extends Promise {} var fulfills = P.race([ new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }), new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }) ]); var rejects = P.race([ new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }), new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }) ]); var score = +(fulfills instanceof P); fulfills.then(function(result) { score += (result === "foo"); check(); }); rejects.catch(function(result) { score += (result === "baz"); check(); }); function check() { if (score === 3) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class P extends Promise {} var fulfills = P.race([ new Promise(function(resolve) { setTimeout(resolve,1000,"foo"); }), new Promise(function(_, reject) { setTimeout(reject, 2000,"bar"); }) ]); var rejects = P.race([ new Promise(function(_, reject) { setTimeout(reject, 1000,"baz"); }), new Promise(function(resolve) { setTimeout(resolve,2000,"qux"); }) ]); var score = +(fulfills instanceof P); fulfills.then(function(result) { score += (result === "foo"); check(); }); rejects.catch(function(result) { score += (result === "baz"); check(); }); function check() { if (score === 3) asyncTestPassed(); }
}

miscellaneous subclassables

§Boolean is subclassable
?
function(){
class C extends Boolean {} var c = new C(true); return c instanceof Boolean && c instanceof C && c == true; // eslint-disable-line eqeqeq
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Boolean {} var c = new C(true); return c instanceof Boolean && c instanceof C && c == true; // eslint-disable-line eqeqeq
}
§Number is subclassable
?
function(){
class C extends Number {} var c = new C(6); return c instanceof Number && c instanceof C && +c === 6;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Number {} var c = new C(6); return c instanceof Number && c instanceof C && +c === 6;
}
§String is subclassable
?
function(){
class C extends String {} var c = new C("golly"); return c instanceof String && c instanceof C && c + '' === "golly" && c[0] === "g" && c.length === 5;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
Error
Error
Error
Error
function(){
class C extends String {} var c = new C("golly"); return c instanceof String && c instanceof C && c + '' === "golly" && c[0] === "g" && c.length === 5;
}
§Error is subclassable
?
function(){
class C extends Error {} var c = new C(); return c instanceof Error && c instanceof C && Object.prototype.toString.call(c) === "[object Error]";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
class C extends Error {} var c = new C(); return c instanceof Error && c instanceof C && Object.prototype.toString.call(c) === "[object Error]";
}
§Map is subclassable
?
function(){
var key = {}; class M extends Map {} var map = new M(); map.set(key, 123); return map instanceof M && map.has(key) && map.get(key) === 123;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var key = {}; class M extends Map {} var map = new M(); map.set(key, 123); return map instanceof M && map.has(key) && map.get(key) === 123;
}
§Set is subclassable
?
function(){
var obj = {}; class S extends Set {} var set = new S(); set.add(123); set.add(123); return set instanceof S && set.has(123);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var obj = {}; class S extends Set {} var set = new S(); set.add(123); set.add(123); return set instanceof S && set.has(123);
}

misc

prototype of bound functions

§basic functions
?
function(){
function correctProtoBound(proto) { var f = function(){}; if (Object.setPrototypeOf) { Object.setPrototypeOf(f, proto); } else { f.__proto__ = proto; } var boundF = Function.prototype.bind.call(f, null); return Object.getPrototypeOf(boundF) === proto; } return correctProtoBound(Function.prototype) && correctProtoBound({}) && correctProtoBound(null);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
function(){
function correctProtoBound(proto) { var f = function(){}; if (Object.setPrototypeOf) { Object.setPrototypeOf(f, proto); } else { f.__proto__ = proto; } var boundF = Function.prototype.bind.call(f, null); return Object.getPrototypeOf(boundF) === proto; } return correctProtoBound(Function.prototype) && correctProtoBound({}) && correctProtoBound(null);
}
§generator functions
?
function(){
function correctProtoBound(proto) { var f = function*(){}; if (Object.setPrototypeOf) { Object.setPrototypeOf(f, proto); } else { f.__proto__ = proto; } var boundF = Function.prototype.bind.call(f, null); return Object.getPrototypeOf(boundF) === proto; } return correctProtoBound(Function.prototype) && correctProtoBound({}) && correctProtoBound(null);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
No
Error
Error
function(){
function correctProtoBound(proto) { var f = function*(){}; if (Object.setPrototypeOf) { Object.setPrototypeOf(f, proto); } else { f.__proto__ = proto; } var boundF = Function.prototype.bind.call(f, null); return Object.getPrototypeOf(boundF) === proto; } return correctProtoBound(Function.prototype) && correctProtoBound({}) && correctProtoBound(null);
}
§arrow functions
?
function(){
function correctProtoBound(proto) { var f = ()=>5; if (Object.setPrototypeOf) { Object.setPrototypeOf(f, proto); } else { f.__proto__ = proto; } var boundF = Function.prototype.bind.call(f, null); return Object.getPrototypeOf(boundF) === proto; } return correctProtoBound(Function.prototype) && correctProtoBound({}) && correctProtoBound(null);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
No
Error
Error
function(){
function correctProtoBound(proto) { var f = ()=>5; if (Object.setPrototypeOf) { Object.setPrototypeOf(f, proto); } else { f.__proto__ = proto; } var boundF = Function.prototype.bind.call(f, null); return Object.getPrototypeOf(boundF) === proto; } return correctProtoBound(Function.prototype) && correctProtoBound({}) && correctProtoBound(null);
}
§classes
?
function(){
function correctProtoBound(proto) { class C {} if (Object.setPrototypeOf) { Object.setPrototypeOf(C, proto); } else { C.__proto__ = proto; } var boundF = Function.prototype.bind.call(C, null); return Object.getPrototypeOf(boundF) === proto; } return correctProtoBound(Function.prototype) && correctProtoBound({}) && correctProtoBound(null);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
function correctProtoBound(proto) { class C {} if (Object.setPrototypeOf) { Object.setPrototypeOf(C, proto); } else { C.__proto__ = proto; } var boundF = Function.prototype.bind.call(C, null); return Object.getPrototypeOf(boundF) === proto; } return correctProtoBound(Function.prototype) && correctProtoBound({}) && correctProtoBound(null);
}
§subclasses
?
function(){
function correctProtoBound(superclass) { class C extends superclass { constructor() { return Object.create(null); } } var boundF = Function.prototype.bind.call(C, null); return Object.getPrototypeOf(boundF) === Object.getPrototypeOf(C); } return correctProtoBound(function(){}) && correctProtoBound(Array) && correctProtoBound(null);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
function correctProtoBound(superclass) { class C extends superclass { constructor() { return Object.create(null); } } var boundF = Function.prototype.bind.call(C, null); return Object.getPrototypeOf(boundF) === Object.getPrototypeOf(C); } return correctProtoBound(function(){}) && correctProtoBound(Array) && correctProtoBound(null);
}

Proxy, internal 'get' calls

§ToPrimitive
?
function(){
// ToPrimitive -> Get -> [[Get]] var get = []; var p = new Proxy({toString:Function()}, { get: function(o, k) { get.push(k); return o[k]; }}); p + 3; return get[0] === Symbol.toPrimitive && get.slice(1) + '' === "valueOf,toString";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// ToPrimitive -> Get -> [[Get]] var get = []; var p = new Proxy({toString:Function()}, { get: function(o, k) { get.push(k); return o[k]; }}); p + 3; return get[0] === Symbol.toPrimitive && get.slice(1) + '' === "valueOf,toString";
}
§CreateListFromArrayLike
?
function(){
// CreateListFromArrayLike -> Get -> [[Get]] var get = []; var p = new Proxy({length:2, 0:0, 1:0}, { get: function(o, k) { get.push(k); return o[k]; }}); Function.prototype.apply({}, p); return get + '' === "length,0,1";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// CreateListFromArrayLike -> Get -> [[Get]] var get = []; var p = new Proxy({length:2, 0:0, 1:0}, { get: function(o, k) { get.push(k); return o[k]; }}); Function.prototype.apply({}, p); return get + '' === "length,0,1";
}
§instanceof operator
?
function(){
// InstanceofOperator -> GetMethod -> GetV -> [[Get]] // InstanceofOperator -> OrdinaryHasInstance -> Get -> [[Get]] var get = []; var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }}); ({}) instanceof p; return get[0] === Symbol.hasInstance && get.slice(1) + '' === "prototype";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// InstanceofOperator -> GetMethod -> GetV -> [[Get]] // InstanceofOperator -> OrdinaryHasInstance -> Get -> [[Get]] var get = []; var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }}); ({}) instanceof p; return get[0] === Symbol.hasInstance && get.slice(1) + '' === "prototype";
}
§HasBinding
?
function(){
// HasBinding -> Get -> [[Get]] var get = []; var p = new Proxy({foo:1}, { get: function(o, k) { get.push(k); return o[k]; }}); p[Symbol.unscopables] = p; with(p) { typeof foo; } return get[0] === Symbol.unscopables && get.slice(1) + '' === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// HasBinding -> Get -> [[Get]] var get = []; var p = new Proxy({foo:1}, { get: function(o, k) { get.push(k); return o[k]; }}); p[Symbol.unscopables] = p; with(p) { typeof foo; } return get[0] === Symbol.unscopables && get.slice(1) + '' === "foo";
}
§CreateDynamicFunction
?
function(){
// CreateDynamicFunction -> GetPrototypeFromConstructor -> Get -> [[Get]] var get = []; var p = new Proxy(Function, { get: function(o, k) { get.push(k); return o[k]; }}); new p; return get + '' === "prototype";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// CreateDynamicFunction -> GetPrototypeFromConstructor -> Get -> [[Get]] var get = []; var p = new Proxy(Function, { get: function(o, k) { get.push(k); return o[k]; }}); new p; return get + '' === "prototype";
}
§ClassDefinitionEvaluation
?
function(){
// ClassDefinitionEvaluation -> Get -> [[Get]] var get = []; var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }}); class C extends p {} return get + '' === "prototype";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// ClassDefinitionEvaluation -> Get -> [[Get]] var get = []; var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }}); class C extends p {} return get + '' === "prototype";
}
§IteratorComplete, IteratorValue
?
function(){
// IteratorComplete -> Get -> [[Get]] // IteratorValue -> Get -> [[Get]] var get = []; var iterable = {}; iterable[Symbol.iterator] = function() { return { next: function() { return new Proxy({ value: 2, done: false }, { get: function(o, k) { get.push(k); return o[k]; }}); } }; } var i = 0; for(var e of iterable) { if (++i >= 2) break; } return get + '' === "done,value,done,value";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// IteratorComplete -> Get -> [[Get]] // IteratorValue -> Get -> [[Get]] var get = []; var iterable = {}; iterable[Symbol.iterator] = function() { return { next: function() { return new Proxy({ value: 2, done: false }, { get: function(o, k) { get.push(k); return o[k]; }}); } }; } var i = 0; for(var e of iterable) { if (++i >= 2) break; } return get + '' === "done,value,done,value";
}
§ToPropertyDescriptor
?
function(){
// ToPropertyDescriptor -> Get -> [[Get]] var get = []; var p = new Proxy({ enumerable: true, configurable: true, value: true, writable: true, get: Function(), set: Function() }, { get: function(o, k) { get.push(k); return o[k]; }}); try { // This will throw, since it will have true for both "get" and "value", // but not before performing a Get on every property. Object.defineProperty({}, "foo", p); } catch(e) { return get + '' === "enumerable,configurable,value,writable,get,set"; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// ToPropertyDescriptor -> Get -> [[Get]] var get = []; var p = new Proxy({ enumerable: true, configurable: true, value: true, writable: true, get: Function(), set: Function() }, { get: function(o, k) { get.push(k); return o[k]; }}); try { // This will throw, since it will have true for both "get" and "value", // but not before performing a Get on every property. Object.defineProperty({}, "foo", p); } catch(e) { return get + '' === "enumerable,configurable,value,writable,get,set"; }
}
§Object.assign
?
function(){
// Object.assign -> Get -> [[Get]] var get = []; var p = new Proxy({foo:1, bar:2}, { get: function(o, k) { get.push(k); return o[k]; }}); Object.assign({}, p); return get + '' === "foo,bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.assign -> Get -> [[Get]] var get = []; var p = new Proxy({foo:1, bar:2}, { get: function(o, k) { get.push(k); return o[k]; }}); Object.assign({}, p); return get + '' === "foo,bar";
}
§Object.defineProperties
?
function(){
// Object.defineProperties -> Get -> [[Get]] var get = []; var p = new Proxy({foo:{}, bar:{}}, { get: function(o, k) { get.push(k); return o[k]; }}); Object.defineProperties({}, p); return get + '' === "foo,bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.defineProperties -> Get -> [[Get]] var get = []; var p = new Proxy({foo:{}, bar:{}}, { get: function(o, k) { get.push(k); return o[k]; }}); Object.defineProperties({}, p); return get + '' === "foo,bar";
}
§Function.prototype.bind
?
function(){
// Function.prototype.bind -> Get -> [[Get]] var get = []; var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }}); Function.prototype.bind.call(p); return get + '' === "length,name";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Function.prototype.bind -> Get -> [[Get]] var get = []; var p = new Proxy(Function(), { get: function(o, k) { get.push(k); return o[k]; }}); Function.prototype.bind.call(p); return get + '' === "length,name";
}
§Error.prototype.toString
?
function(){
// Error.prototype.toString -> Get -> [[Get]] var get = []; var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }}); Error.prototype.toString.call(p); return get + '' === "name,message";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Error.prototype.toString -> Get -> [[Get]] var get = []; var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }}); Error.prototype.toString.call(p); return get + '' === "name,message";
}
§String.raw
?
function(){
// String.raw -> Get -> [[Get]] var get = []; var raw = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); var p = new Proxy({raw: raw}, { get: function(o, k) { get.push(k); return o[k]; }}); String.raw(p); return get + '' === "raw,length,0,1";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// String.raw -> Get -> [[Get]] var get = []; var raw = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); var p = new Proxy({raw: raw}, { get: function(o, k) { get.push(k); return o[k]; }}); String.raw(p); return get + '' === "raw,length,0,1";
}
§RegExp constructor
?
function(){
// RegExp -> Get -> [[Get]] var get = []; var re = { constructor: null }; re[Symbol.match] = true; var p = new Proxy(re, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp(p); return get[0] === Symbol.match && get.slice(1) + '' === "constructor,source,flags";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// RegExp -> Get -> [[Get]] var get = []; var re = { constructor: null }; re[Symbol.match] = true; var p = new Proxy(re, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp(p); return get[0] === Symbol.match && get.slice(1) + '' === "constructor,source,flags";
}
§RegExp.prototype.flags
?
function(){
// RegExp.prototype.flags -> Get -> [[Get]] var expected = []; // Sorted alphabetically by shortname – "gimsuy". if ('global' in RegExp.prototype) expected.push('global'); if ('ignoreCase' in RegExp.prototype) expected.push('ignoreCase'); if ('multiline' in RegExp.prototype) expected.push('multiline'); if ('dotAll' in RegExp.prototype) expected.push('dotAll'); if ('unicode' in RegExp.prototype) expected.push('unicode'); if ('sticky' in RegExp.prototype) expected.push('sticky'); var actual = []; var p = new Proxy({}, { get: function(o, k) { actual.push(k); return o[k]; }}); Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(p); if (expected.length !== actual.length) return false; for (var i = 0; i < expected.length; i++) { if (expected[i] !== actual[i]) return false; } return true;
}
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// RegExp.prototype.flags -> Get -> [[Get]] var expected = []; // Sorted alphabetically by shortname – "gimsuy". if ('global' in RegExp.prototype) expected.push('global'); if ('ignoreCase' in RegExp.prototype) expected.push('ignoreCase'); if ('multiline' in RegExp.prototype) expected.push('multiline'); if ('dotAll' in RegExp.prototype) expected.push('dotAll'); if ('unicode' in RegExp.prototype) expected.push('unicode'); if ('sticky' in RegExp.prototype) expected.push('sticky'); var actual = []; var p = new Proxy({}, { get: function(o, k) { actual.push(k); return o[k]; }}); Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(p); if (expected.length !== actual.length) return false; for (var i = 0; i < expected.length; i++) { if (expected[i] !== actual[i]) return false; } return true;
}
§RegExp.prototype.test
?
function(){
// RegExp.prototype.test -> RegExpExec -> Get -> [[Get]] var get = []; var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype.test.call(p); return get + '' === "exec";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// RegExp.prototype.test -> RegExpExec -> Get -> [[Get]] var get = []; var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype.test.call(p); return get + '' === "exec";
}
§RegExp.prototype.toString
?
function(){
// RegExp.prototype.toString -> Get -> [[Get]] var get = []; var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype.toString.call(p); return get + '' === "source,flags";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// RegExp.prototype.toString -> Get -> [[Get]] var get = []; var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype.toString.call(p); return get + '' === "source,flags";
}
§RegExp.prototype[Symbol.match]
?
function(){
// RegExp.prototype[Symbol.match] -> Get -> [[Get]] var get = []; var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype[Symbol.match].call(p); p.global = true; RegExp.prototype[Symbol.match].call(p); return get + '' === "global,exec,global,unicode,exec";
}
No
No
No
No
No
No
No
No
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// RegExp.prototype[Symbol.match] -> Get -> [[Get]] var get = []; var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype[Symbol.match].call(p); p.global = true; RegExp.prototype[Symbol.match].call(p); return get + '' === "global,exec,global,unicode,exec";
}
§RegExp.prototype[Symbol.replace]
?
function(){
// RegExp.prototype[Symbol.replace] -> Get -> [[Get]] var get = []; var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype[Symbol.replace].call(p); p.global = true; RegExp.prototype[Symbol.replace].call(p); return get + '' === "global,exec,global,unicode,exec";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// RegExp.prototype[Symbol.replace] -> Get -> [[Get]] var get = []; var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype[Symbol.replace].call(p); p.global = true; RegExp.prototype[Symbol.replace].call(p); return get + '' === "global,exec,global,unicode,exec";
}
§RegExp.prototype[Symbol.search]
?
function(){
// RegExp.prototype[Symbol.search] -> Get -> [[Get]] var get = []; var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype[Symbol.search].call(p); return get + '' === "lastIndex,exec,lastIndex";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// RegExp.prototype[Symbol.search] -> Get -> [[Get]] var get = []; var p = new Proxy({ exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype[Symbol.search].call(p); return get + '' === "lastIndex,exec,lastIndex";
}
§RegExp.prototype[Symbol.split]
?
function(){
// RegExp.prototype[Symbol.split] -> Get -> [[Get]] var get = []; var constructor = Function(); constructor[Symbol.species] = Object; var p = new Proxy({ constructor: constructor, flags: '', exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype[Symbol.split].call(p, ""); return get + '' === "constructor,flags,exec";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// RegExp.prototype[Symbol.split] -> Get -> [[Get]] var get = []; var constructor = Function(); constructor[Symbol.species] = Object; var p = new Proxy({ constructor: constructor, flags: '', exec: function() { return null; } }, { get: function(o, k) { get.push(k); return o[k]; }}); RegExp.prototype[Symbol.split].call(p, ""); return get + '' === "constructor,flags,exec";
}
§Array.from
?
function(){
// Array.from -> Get -> [[Get]] var get = []; var p = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); Array.from(p); return get[0] === Symbol.iterator && get.slice(1) + '' === "length,0,1";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.from -> Get -> [[Get]] var get = []; var p = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); Array.from(p); return get[0] === Symbol.iterator && get.slice(1) + '' === "length,0,1";
}
§Array.prototype.concat
?
function(){
// Array.prototype.concat -> Get -> [[Get]] var get = []; var arr = [1]; arr.constructor = void undefined; var p = new Proxy(arr, { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.concat.call(p,p); return get[0] === "constructor" && get[1] === Symbol.isConcatSpreadable && get[2] === "length" && get[3] === "0" && get[4] === get[1] && get[5] === get[2] && get[6] === get[3] && get.length === 7;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.concat -> Get -> [[Get]] var get = []; var arr = [1]; arr.constructor = void undefined; var p = new Proxy(arr, { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.concat.call(p,p); return get[0] === "constructor" && get[1] === Symbol.isConcatSpreadable && get[2] === "length" && get[3] === "0" && get[4] === get[1] && get[5] === get[2] && get[6] === get[3] && get.length === 7;
}
§Array.prototype iteration methods
?
function(){
// Array.prototype methods -> Get -> [[Get]] var methods = ['copyWithin', 'every', 'fill', 'filter', 'find', 'findIndex', 'forEach', 'indexOf', 'join', 'lastIndexOf', 'map', 'reduce', 'reduceRight', 'some']; var get; var p = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); for(var i = 0; i < methods.length; i+=1) { get = []; Array.prototype[methods[i]].call(p, Function()); if (get + '' !== ( methods[i] === 'fill' ? "length" : methods[i] === 'every' ? "length,0" : methods[i] === 'lastIndexOf' || methods[i] === 'reduceRight' ? "length,1,0" : "length,0,1" )) { return false; } } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype methods -> Get -> [[Get]] var methods = ['copyWithin', 'every', 'fill', 'filter', 'find', 'findIndex', 'forEach', 'indexOf', 'join', 'lastIndexOf', 'map', 'reduce', 'reduceRight', 'some']; var get; var p = new Proxy({length: 2, 0: '', 1: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); for(var i = 0; i < methods.length; i+=1) { get = []; Array.prototype[methods[i]].call(p, Function()); if (get + '' !== ( methods[i] === 'fill' ? "length" : methods[i] === 'every' ? "length,0" : methods[i] === 'lastIndexOf' || methods[i] === 'reduceRight' ? "length,1,0" : "length,0,1" )) { return false; } } return true;
}
§Array.prototype.pop
?
function(){
// Array.prototype.pop -> Get -> [[Get]] var get = []; var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.pop.call(p); return get + '' === "length,3";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.pop -> Get -> [[Get]] var get = []; var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.pop.call(p); return get + '' === "length,3";
}
§Array.prototype.reverse
?
function(){
// Array.prototype.reverse -> Get -> [[Get]] var get = []; var p = new Proxy([0,,2,,4,,], { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.reverse.call(p); return get + '' === "length,0,4,2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.reverse -> Get -> [[Get]] var get = []; var p = new Proxy([0,,2,,4,,], { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.reverse.call(p); return get + '' === "length,0,4,2";
}
§Array.prototype.shift
?
function(){
// Array.prototype.shift -> Get -> [[Get]] var get = []; var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.shift.call(p); return get + '' === "length,0,1,2,3";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.shift -> Get -> [[Get]] var get = []; var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.shift.call(p); return get + '' === "length,0,1,2,3";
}
§Array.prototype.splice
?
function(){
// Array.prototype.splice -> Get -> [[Get]] var get = []; var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.splice.call(p,1,1); Array.prototype.splice.call(p,1,0,1); return get + '' === "length,constructor,1,2,3,length,constructor,2,1";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.splice -> Get -> [[Get]] var get = []; var p = new Proxy([0,1,2,3], { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.splice.call(p,1,1); Array.prototype.splice.call(p,1,0,1); return get + '' === "length,constructor,1,2,3,length,constructor,2,1";
}
§Array.prototype.toString
?
function(){
// Array.prototype.toString -> Get -> [[Get]] var get = []; var p = new Proxy({ join:Function() }, { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.toString.call(p); return get + '' === "join";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.toString -> Get -> [[Get]] var get = []; var p = new Proxy({ join:Function() }, { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.toString.call(p); return get + '' === "join";
}
§JSON.stringify
?
function(){
// JSON.stringify -> Get -> [[Get]] var get = []; var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }}); JSON.stringify(p); return get + '' === "toJSON";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// JSON.stringify -> Get -> [[Get]] var get = []; var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }}); JSON.stringify(p); return get + '' === "toJSON";
}
§Promise resolve functions
?
function(){
// Promise resolve functions -> Get -> [[Get]] var get = []; var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }}); new Promise(function(resolve){ resolve(p); }); return get + '' === "then";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Promise resolve functions -> Get -> [[Get]] var get = []; var p = new Proxy({}, { get: function(o, k) { get.push(k); return o[k]; }}); new Promise(function(resolve){ resolve(p); }); return get + '' === "then";
}
§String.prototype.match
?
function(){
// String.prototype.match -> Get -> [[Get]] var get = []; var proxied = {}; proxied[Symbol.toPrimitive] = Function(); var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }}); "".match(p); return get[0] === Symbol.match && get[1] === Symbol.toPrimitive && get.length === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// String.prototype.match -> Get -> [[Get]] var get = []; var proxied = {}; proxied[Symbol.toPrimitive] = Function(); var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }}); "".match(p); return get[0] === Symbol.match && get[1] === Symbol.toPrimitive && get.length === 2;
}
§String.prototype.replace
?
function(){
// String.prototype.replace functions -> Get -> [[Get]] var get = []; var proxied = {}; proxied[Symbol.toPrimitive] = Function(); var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }}); "".replace(p); return get[0] === Symbol.replace && get[1] === Symbol.toPrimitive && get.length === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// String.prototype.replace functions -> Get -> [[Get]] var get = []; var proxied = {}; proxied[Symbol.toPrimitive] = Function(); var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }}); "".replace(p); return get[0] === Symbol.replace && get[1] === Symbol.toPrimitive && get.length === 2;
}
§String.prototype.search
?
function(){
// String.prototype.search functions -> Get -> [[Get]] var get = []; var proxied = {}; proxied[Symbol.toPrimitive] = Function(); var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }}); "".search(p); return get[0] === Symbol.search && get[1] === Symbol.toPrimitive && get.length === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// String.prototype.search functions -> Get -> [[Get]] var get = []; var proxied = {}; proxied[Symbol.toPrimitive] = Function(); var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }}); "".search(p); return get[0] === Symbol.search && get[1] === Symbol.toPrimitive && get.length === 2;
}
§String.prototype.split
?
function(){
// String.prototype.split functions -> Get -> [[Get]] var get = []; var proxied = {}; proxied[Symbol.toPrimitive] = Function(); var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }}); "".split(p); return get[0] === Symbol.split && get[1] === Symbol.toPrimitive && get.length === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// String.prototype.split functions -> Get -> [[Get]] var get = []; var proxied = {}; proxied[Symbol.toPrimitive] = Function(); var p = new Proxy(proxied, { get: function(o, k) { get.push(k); return o[k]; }}); "".split(p); return get[0] === Symbol.split && get[1] === Symbol.toPrimitive && get.length === 2;
}
§Date.prototype.toJSON
?
function(){
// Date.prototype.toJSON -> ToPrimitive -> Get -> [[Get]] // Date.prototype.toJSON -> Invoke -> GetMethod -> GetV -> [[Get]] var get = []; var p = new Proxy({toString:Function(),toISOString:Function()}, { get: function(o, k) { get.push(k); return o[k]; }}); Date.prototype.toJSON.call(p); return get[0] === Symbol.toPrimitive && get.slice(1) + '' === "valueOf,toString,toISOString";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Date.prototype.toJSON -> ToPrimitive -> Get -> [[Get]] // Date.prototype.toJSON -> Invoke -> GetMethod -> GetV -> [[Get]] var get = []; var p = new Proxy({toString:Function(),toISOString:Function()}, { get: function(o, k) { get.push(k); return o[k]; }}); Date.prototype.toJSON.call(p); return get[0] === Symbol.toPrimitive && get.slice(1) + '' === "valueOf,toString,toISOString";
}

Proxy, internal 'set' calls

§Object.assign
?
function(){
// Object.assign -> Set -> [[Set]] var set = []; var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); Object.assign(p, { foo: 1, bar: 2 }); return set + '' === "foo,bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.assign -> Set -> [[Set]] var set = []; var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); Object.assign(p, { foo: 1, bar: 2 }); return set + '' === "foo,bar";
}
§Array.from
?
function(){
// Array.from -> Set -> [[Set]] var set = []; var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); Array.from.call(function(){ return p; }, {length:2, 0:1, 1:2}); return set + '' === "length";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.from -> Set -> [[Set]] var set = []; var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); Array.from.call(function(){ return p; }, {length:2, 0:1, 1:2}); return set + '' === "length";
}
§Array.of
?
function(){
// Array.from -> Set -> [[Set]] var set = []; var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); Array.of.call(function(){ return p; }, 1, 2, 3); return set + '' === "length";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.from -> Set -> [[Set]] var set = []; var p = new Proxy({}, { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); Array.of.call(function(){ return p; }, 1, 2, 3); return set + '' === "length";
}
§Array.prototype.copyWithin
?
function(){
// Array.prototype.copyWithin -> Set -> [[Set]] var set = []; var p = new Proxy([1,2,3,4,5,6], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.copyWithin(0, 3); return set + '' === "0,1,2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.copyWithin -> Set -> [[Set]] var set = []; var p = new Proxy([1,2,3,4,5,6], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.copyWithin(0, 3); return set + '' === "0,1,2";
}
§Array.prototype.fill
?
function(){
// Array.prototype.fill -> Set -> [[Set]] var set = []; var p = new Proxy([1,2,3,4,5,6], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.fill(0, 3); return set + '' === "3,4,5";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.fill -> Set -> [[Set]] var set = []; var p = new Proxy([1,2,3,4,5,6], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.fill(0, 3); return set + '' === "3,4,5";
}
§Array.prototype.pop
?
function(){
// Array.prototype.pop -> Set -> [[Set]] var set = []; var p = new Proxy([], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.pop(); return set + '' === "length";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.pop -> Set -> [[Set]] var set = []; var p = new Proxy([], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.pop(); return set + '' === "length";
}
§Array.prototype.push
?
function(){
// Array.prototype.push -> Set -> [[Set]] var set = []; var p = new Proxy([], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.push(0,0,0); return set + '' === "0,1,2,length";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.push -> Set -> [[Set]] var set = []; var p = new Proxy([], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.push(0,0,0); return set + '' === "0,1,2,length";
}
§Array.prototype.reverse
?
function(){
// Array.prototype.reverse -> Set -> [[Set]] var set = []; var p = new Proxy([0,0,0,,], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.reverse(); return set + '' === "3,1,2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.reverse -> Set -> [[Set]] var set = []; var p = new Proxy([0,0,0,,], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.reverse(); return set + '' === "3,1,2";
}
§Array.prototype.shift
?
function(){
// Array.prototype.shift -> Set -> [[Set]] var set = []; var p = new Proxy([0,0,,0], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.shift(); return set + '' === "0,2,length";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.shift -> Set -> [[Set]] var set = []; var p = new Proxy([0,0,,0], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.shift(); return set + '' === "0,2,length";
}
§Array.prototype.splice
?
function(){
// Array.prototype.splice -> Set -> [[Set]] var set = []; var p = new Proxy([1,2,3], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.splice(1,0,0); return set + '' === "3,2,1,length";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.splice -> Set -> [[Set]] var set = []; var p = new Proxy([1,2,3], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.splice(1,0,0); return set + '' === "3,2,1,length";
}
§Array.prototype.unshift
?
function(){
// Array.prototype.unshift -> Set -> [[Set]] var set = []; var p = new Proxy([0,0,,0], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.unshift(0,1); return set + '' === "5,3,2,0,1,length";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.unshift -> Set -> [[Set]] var set = []; var p = new Proxy([0,0,,0], { set: function(o, k, v) { set.push(k); o[k] = v; return true; }}); p.unshift(0,1); return set + '' === "5,3,2,0,1,length";
}

Proxy, internal 'defineProperty' calls

§[[Set]]
?
function(){
// [[Set]] -> [[DefineOwnProperty]] var def = []; var p = new Proxy({foo:1, bar:2}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }}); p.foo = 2; p.bar = 4; return def + '' === "foo,bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// [[Set]] -> [[DefineOwnProperty]] var def = []; var p = new Proxy({foo:1, bar:2}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }}); p.foo = 2; p.bar = 4; return def + '' === "foo,bar";
}
§SetIntegrityLevel
?
function(){
// SetIntegrityLevel -> DefinePropertyOrThrow -> [[DefineOwnProperty]] var def = []; var p = new Proxy({foo:1, bar:2}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }}); Object.freeze(p); return def + '' === "foo,bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// SetIntegrityLevel -> DefinePropertyOrThrow -> [[DefineOwnProperty]] var def = []; var p = new Proxy({foo:1, bar:2}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }}); Object.freeze(p); return def + '' === "foo,bar";
}

Proxy, internal 'deleteProperty' calls

§Array.prototype.copyWithin
?
function(){
// Array.prototype.copyWithin -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,0,0,,,,], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.copyWithin(0,3); return del + '' === "0,1,2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.copyWithin -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,0,0,,,,], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.copyWithin(0,3); return del + '' === "0,1,2";
}
§Array.prototype.pop
?
function(){
// Array.prototype.pop -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,0,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.pop(); return del + '' === "2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.pop -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,0,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.pop(); return del + '' === "2";
}
§Array.prototype.reverse
?
function(){
// Array.prototype.reverse -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,,2,,4,,], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.reverse(); return del + '' === "0,4,2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.reverse -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,,2,,4,,], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.reverse(); return del + '' === "0,4,2";
}
§Array.prototype.shift
?
function(){
// Array.prototype.shift -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,,0,,0,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.shift(); return del + '' === "0,2,5";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.shift -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,,0,,0,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.shift(); return del + '' === "0,2,5";
}
§Array.prototype.splice
?
function(){
// Array.prototype.splice -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,0,0,0,,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.splice(2,2,0); return del + '' === "3,5";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.splice -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,0,0,0,,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.splice(2,2,0); return del + '' === "3,5";
}
§Array.prototype.unshift
?
function(){
// Array.prototype.unshift -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,0,,0,,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.unshift(0); return del + '' === "5,3";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.unshift -> DeletePropertyOrThrow -> [[Delete]] var del = []; var p = new Proxy([0,0,,0,,0], { deleteProperty: function(o, v) { del.push(v); return delete o[v]; }}); p.unshift(0); return del + '' === "5,3";
}

Proxy, internal 'getOwnPropertyDescriptor' calls

§[[Set]]
?
function(){
// [[Set]] -> [[GetOwnProperty]] var gopd = []; var p = new Proxy({}, { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }}); p.foo = 1; p.bar = 1; return gopd + '' === "foo,bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// [[Set]] -> [[GetOwnProperty]] var gopd = []; var p = new Proxy({}, { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }}); p.foo = 1; p.bar = 1; return gopd + '' === "foo,bar";
}
§Object.assign
?
function(){
// Object.assign -> [[GetOwnProperty]] var gopd = []; var p = new Proxy({foo:1, bar:2}, { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }}); Object.assign({}, p); return gopd + '' === "foo,bar";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.assign -> [[GetOwnProperty]] var gopd = []; var p = new Proxy({foo:1, bar:2}, { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }}); Object.assign({}, p); return gopd + '' === "foo,bar";
}
§Object.prototype.hasOwnProperty
?
function(){
// Object.prototype.hasOwnProperty -> HasOwnProperty -> [[GetOwnProperty]] var gopd = []; var p = new Proxy({foo:1, bar:2}, { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }}); p.hasOwnProperty('garply'); return gopd + '' === "garply";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.prototype.hasOwnProperty -> HasOwnProperty -> [[GetOwnProperty]] var gopd = []; var p = new Proxy({foo:1, bar:2}, { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }}); p.hasOwnProperty('garply'); return gopd + '' === "garply";
}
§Function.prototype.bind
?
function(){
// Function.prototype.bind -> HasOwnProperty -> [[GetOwnProperty]] var gopd = []; var p = new Proxy(Function(), { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }}); p.bind(); return gopd + '' === "length";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Function.prototype.bind -> HasOwnProperty -> [[GetOwnProperty]] var gopd = []; var p = new Proxy(Function(), { getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); }}); p.bind(); return gopd + '' === "length";
}

Proxy, internal 'ownKeys' calls

§SetIntegrityLevel
?
function(){
// SetIntegrityLevel -> [[OwnPropertyKeys]] var ownKeysCalled = 0; var p = new Proxy({}, { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }}); Object.freeze(p); return ownKeysCalled === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// SetIntegrityLevel -> [[OwnPropertyKeys]] var ownKeysCalled = 0; var p = new Proxy({}, { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }}); Object.freeze(p); return ownKeysCalled === 1;
}
§TestIntegrityLevel
?
function(){
// TestIntegrityLevel -> [[OwnPropertyKeys]] var ownKeysCalled = 0; var p = new Proxy(Object.preventExtensions({}), { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }}); Object.isFrozen(p); return ownKeysCalled === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// TestIntegrityLevel -> [[OwnPropertyKeys]] var ownKeysCalled = 0; var p = new Proxy(Object.preventExtensions({}), { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }}); Object.isFrozen(p); return ownKeysCalled === 1;
}
§SerializeJSONObject
?
function(){
// SerializeJSONObject -> EnumerableOwnNames -> [[OwnPropertyKeys]] var ownKeysCalled = 0; var p = new Proxy({}, { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }}); JSON.stringify({a:p,b:p}); return ownKeysCalled === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// SerializeJSONObject -> EnumerableOwnNames -> [[OwnPropertyKeys]] var ownKeysCalled = 0; var p = new Proxy({}, { ownKeys: function(o) { ownKeysCalled++; return Object.keys(o); }}); JSON.stringify({a:p,b:p}); return ownKeysCalled === 2;
}

Object static methods accept primitives

§Object.getPrototypeOf
?
function(){
return Object.getPrototypeOf('a').constructor === String;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Object.getPrototypeOf('a').constructor === String;
}
§Object.getOwnPropertyDescriptor
?
function(){
return Object.getOwnPropertyDescriptor('a', 'foo') === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Object.getOwnPropertyDescriptor('a', 'foo') === void undefined;
}
§Object.getOwnPropertyNames
?
function(){
var s = Object.getOwnPropertyNames('a'); return s.length === 2 && ((s[0] === 'length' && s[1] === '0') || (s[0] === '0' && s[1] === 'length'));
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var s = Object.getOwnPropertyNames('a'); return s.length === 2 && ((s[0] === 'length' && s[1] === '0') || (s[0] === '0' && s[1] === 'length'));
}
§Object.seal
?
function(){
return Object.seal('a') === 'a';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Object.seal('a') === 'a';
}
§Object.freeze
?
function(){
return Object.freeze('a') === 'a';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Object.freeze('a') === 'a';
}
§Object.preventExtensions
?
function(){
return Object.preventExtensions('a') === 'a';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Object.preventExtensions('a') === 'a';
}
§Object.isSealed
?
function(){
return Object.isSealed('a') === true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Object.isSealed('a') === true;
}
§Object.isFrozen
?
function(){
return Object.isFrozen('a') === true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Object.isFrozen('a') === true;
}
§Object.isExtensible
?
function(){
return Object.isExtensible('a') === false;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
return Object.isExtensible('a') === false;
}
§Object.keys
?
function(){
var s = Object.keys('a'); return s.length === 1 && s[0] === '0';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var s = Object.keys('a'); return s.length === 1 && s[0] === '0';
}

own property order

§Object.keys
?
function(){
var obj = { // Non-negative integer names appear first in value order 2: true, 0: true, 1: true, // Other string names appear in source order ' ': true, // Non-negative integers are sorted above other names 9: true, D: true, B: true, // Negative integers are treated as other names '-1': true }; // Other string names are added in order of creation obj.A = true; // Non-negative integer names, conversely, ignore order of creation obj[3] = true; // Having a total of 20+ properties doesn't affect property order "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){ obj[key] = true; }); // Object.defineProperty doesn't affect the above rules Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, '4', { value: true, enumerable: true }); // Deleting and reinserting a property doesn't preserve its position delete obj[2]; obj[2] = true; var forInOrder = ''; for(var key in obj)forInOrder += key; return Object.keys(obj).join('') === forInOrder;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var obj = { // Non-negative integer names appear first in value order 2: true, 0: true, 1: true, // Other string names appear in source order ' ': true, // Non-negative integers are sorted above other names 9: true, D: true, B: true, // Negative integers are treated as other names '-1': true }; // Other string names are added in order of creation obj.A = true; // Non-negative integer names, conversely, ignore order of creation obj[3] = true; // Having a total of 20+ properties doesn't affect property order "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){ obj[key] = true; }); // Object.defineProperty doesn't affect the above rules Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, '4', { value: true, enumerable: true }); // Deleting and reinserting a property doesn't preserve its position delete obj[2]; obj[2] = true; var forInOrder = ''; for(var key in obj)forInOrder += key; return Object.keys(obj).join('') === forInOrder;
}
§Object.getOwnPropertyNames
?
function(){
var obj = { 2: true, 0: true, 1: true, ' ': true, 9: true, D: true, B: true, '-1': true }; obj.A = true; obj[3] = true; "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){ obj[key] = true; }); Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, '4', { value: true, enumerable: true }); delete obj[2]; obj[2] = true; return Object.getOwnPropertyNames(obj).join('') === "012349 DB-1AEFGHIJKLMNOPQRSTUVWXYZC";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
var obj = { 2: true, 0: true, 1: true, ' ': true, 9: true, D: true, B: true, '-1': true }; obj.A = true; obj[3] = true; "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){ obj[key] = true; }); Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, '4', { value: true, enumerable: true }); delete obj[2]; obj[2] = true; return Object.getOwnPropertyNames(obj).join('') === "012349 DB-1AEFGHIJKLMNOPQRSTUVWXYZC";
}
§Object.assign
?
function(){
var result = ''; var target = {}; "012349 DBACEFGHIJKLMNOPQRST".split('').concat(-1).forEach(function(key){ Object.defineProperty(target, key, { set: function(){ result += key; } }) }); var obj = {2: 2, 0: 0, 1: 1, ' ': ' ', 9: 9, D: 'D', B: 'B', '-1': '-1'}; Object.defineProperty(obj, 'A', {value: 'A', enumerable: true}); Object.defineProperty(obj, '3', {value: '3', enumerable: true}); Object.defineProperty(obj, 'C', {value: 'C', enumerable: true}); Object.defineProperty(obj, '4', {value: '4', enumerable: true}); delete obj[2]; obj[2] = true; "EFGHIJKLMNOPQRST".split('').forEach(function(key){ obj[key] = key; }); Object.assign(target, obj); return result === "012349 DB-1ACEFGHIJKLMNOPQRST";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Error
Error
Error
Error
function(){
var result = ''; var target = {}; "012349 DBACEFGHIJKLMNOPQRST".split('').concat(-1).forEach(function(key){ Object.defineProperty(target, key, { set: function(){ result += key; } }) }); var obj = {2: 2, 0: 0, 1: 1, ' ': ' ', 9: 9, D: 'D', B: 'B', '-1': '-1'}; Object.defineProperty(obj, 'A', {value: 'A', enumerable: true}); Object.defineProperty(obj, '3', {value: '3', enumerable: true}); Object.defineProperty(obj, 'C', {value: 'C', enumerable: true}); Object.defineProperty(obj, '4', {value: '4', enumerable: true}); delete obj[2]; obj[2] = true; "EFGHIJKLMNOPQRST".split('').forEach(function(key){ obj[key] = key; }); Object.assign(target, obj); return result === "012349 DB-1ACEFGHIJKLMNOPQRST";
}
§JSON.stringify
?
function(){
var obj = { 2: true, 0: true, 1: true, ' ': true, 9: true, D: true, B: true, '-1': true }; obj.A = true; obj[3] = true; "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){ obj[key] = true; }); Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, '4', { value: true, enumerable: true }); delete obj[2]; obj[2] = true; return JSON.stringify(obj) === '{"0":true,"1":true,"2":true,"3":true,"4":true,"9":true," ":true,"D":true,"B":true,"-1":true,"A":true,"E":true,"F":true,"G":true,"H":true,"I":true,"J":true,"K":true,"L":true,"M":true,"N":true,"O":true,"P":true,"Q":true,"R":true,"S":true,"T":true,"U":true,"V":true,"W":true,"X":true,"Y":true,"Z":true,"C":true}';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var obj = { 2: true, 0: true, 1: true, ' ': true, 9: true, D: true, B: true, '-1': true }; obj.A = true; obj[3] = true; "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){ obj[key] = true; }); Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, '4', { value: true, enumerable: true }); delete obj[2]; obj[2] = true; return JSON.stringify(obj) === '{"0":true,"1":true,"2":true,"3":true,"4":true,"9":true," ":true,"D":true,"B":true,"-1":true,"A":true,"E":true,"F":true,"G":true,"H":true,"I":true,"J":true,"K":true,"L":true,"M":true,"N":true,"O":true,"P":true,"Q":true,"R":true,"S":true,"T":true,"U":true,"V":true,"W":true,"X":true,"Y":true,"Z":true,"C":true}';
}
§JSON.parse
?
function(){
var result = ''; JSON.parse( '{"0":true,"1":true,"2":true,"3":true,"4":true,"9":true," ":true,"D":true,"B":true,"-1":true,"E":true,"F":true,"G":true,"H":true,"I":true,"J":true,"K":true,"L":true,"A":true,"C":true}', function reviver(k,v) { result += k; return v; } ); return result === "012349 DB-1EFGHIJKLAC";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var result = ''; JSON.parse( '{"0":true,"1":true,"2":true,"3":true,"4":true,"9":true," ":true,"D":true,"B":true,"-1":true,"E":true,"F":true,"G":true,"H":true,"I":true,"J":true,"K":true,"L":true,"A":true,"C":true}', function reviver(k,v) { result += k; return v; } ); return result === "012349 DB-1EFGHIJKLAC";
}
§Reflect.ownKeys, string key order
?
function(){
var obj = { 2: true, 0: true, 1: true, ' ': true, 9: true, D: true, B: true, '-1': true }; obj.A = true; obj[3] = true; "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){ obj[key] = true; }); Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, '4', { value: true, enumerable: true }); delete obj[2]; obj[2] = true; return Reflect.ownKeys(obj).join('') === "012349 DB-1AEFGHIJKLMNOPQRSTUVWXYZC";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = { 2: true, 0: true, 1: true, ' ': true, 9: true, D: true, B: true, '-1': true }; obj.A = true; obj[3] = true; "EFGHIJKLMNOPQRSTUVWXYZ".split('').forEach(function(key){ obj[key] = true; }); Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, '4', { value: true, enumerable: true }); delete obj[2]; obj[2] = true; return Reflect.ownKeys(obj).join('') === "012349 DB-1AEFGHIJKLMNOPQRSTUVWXYZC";
}
§Reflect.ownKeys, symbol key order
?
function(){
var sym1 = Symbol(), sym2 = Symbol(), sym3 = Symbol(); var obj = { 1: true, A: true }; obj.B = true; obj[sym1] = true; obj[2] = true; obj[sym2] = true; Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, sym3,{ value: true, enumerable: true }); Object.defineProperty(obj, 'D', { value: true, enumerable: true }); var result = Reflect.ownKeys(obj); var l = result.length; return result[l-3] === sym1 && result[l-2] === sym2 && result[l-1] === sym3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var sym1 = Symbol(), sym2 = Symbol(), sym3 = Symbol(); var obj = { 1: true, A: true }; obj.B = true; obj[sym1] = true; obj[2] = true; obj[sym2] = true; Object.defineProperty(obj, 'C', { value: true, enumerable: true }); Object.defineProperty(obj, sym3,{ value: true, enumerable: true }); Object.defineProperty(obj, 'D', { value: true, enumerable: true }); var result = Reflect.ownKeys(obj); var l = result.length; return result[l-3] === sym1 && result[l-2] === sym2 && result[l-1] === sym3;
}

Updated identifier syntax

§var ⸯ;
?
function(){
try { eval('var ⸯ'); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
try { eval('var ⸯ'); } catch(e) { return true; }
}
§var 𐋀;
?
function(){
var 𐋀; return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
var 𐋀; return true;
}
§no escaped reserved words as identifiers
?
function(){
var \u0061; try { eval('var v\\u0061r'); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
var \u0061; try { eval('var v\\u0061r'); } catch(e) { return true; }
}

miscellaneous

§duplicate property names in strict mode
?
function(){
'use strict'; return this === void undefined && ({ a:1, a:1 }).a === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
'use strict'; return this === void undefined && ({ a:1, a:1 }).a === 1;
}
§no semicolon needed after do-while
?
function(){
do {} while (false) return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
do {} while (false) return true;
}
§no assignments allowed in for-in head in strict mode
?
function(){
'use strict'; try { eval('for (var i = 0 in {}) {}'); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
'use strict'; try { eval('for (var i = 0 in {}) {}'); } catch(e) { return true; }
}
§accessors aren't constructors
?
function(){
var f = (Object.getOwnPropertyDescriptor({get a(){}}, 'a')).get; try { new f; } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
var f = (Object.getOwnPropertyDescriptor({get a(){}}, 'a')).get; try { new f; } catch(e) { return true; }
}
§Invalid Date
?
function(){
return new Date(NaN) + "" === "Invalid Date";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return new Date(NaN) + "" === "Invalid Date";
}
§RegExp constructor can alter flags
?
function(){
return new RegExp(/./im, "g").global === true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new RegExp(/./im, "g").global === true;
}
§RegExp.prototype.toString generic and uses "flags" property
?
function(){
return RegExp.prototype.toString.call({source: 'foo', flags: 'bar'}) === '/foo/bar';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return RegExp.prototype.toString.call({source: 'foo', flags: 'bar'}) === '/foo/bar';
}
§built-in prototypes are not instances
?
function(){
try { RegExp.prototype.exec(); return false; } catch(e) {} try { Date.prototype.valueOf(); return false; } catch(e) {} if (![Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError].every(function (E) { return Object.prototype.toString.call(E.prototype) === '[object Object]'; })) { return false; } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
try { RegExp.prototype.exec(); return false; } catch(e) {} try { Date.prototype.valueOf(); return false; } catch(e) {} if (![Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError].every(function (E) { return Object.prototype.toString.call(E.prototype) === '[object Object]'; })) { return false; } return true;
}
§function 'length' is configurable
?
function(){
var fn = function(a, b) {}; var desc = Object.getOwnPropertyDescriptor(fn, "length"); if (desc.configurable) { Object.defineProperty(fn, "length", { value: 1 }); return fn.length === 1; } return false;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
var fn = function(a, b) {}; var desc = Object.getOwnPropertyDescriptor(fn, "length"); if (desc.configurable) { Object.defineProperty(fn, "length", { value: 1 }); return fn.length === 1; } return false;
}

annex b

non-strict function semantics

§hoisted block-level function declaration
?
function(){
// Note: only available outside of strict mode. if (!this) return false; var passed = f() === 1; function f() { return 1; } passed &= typeof g === 'undefined'; { function g() { return 1; } } passed &= g() === 1; passed &= h() === 2; { function h() { return 1; } } function h() { return 2; } passed &= h() === 1; return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
function(){
// Note: only available outside of strict mode. if (!this) return false; var passed = f() === 1; function f() { return 1; } passed &= typeof g === 'undefined'; { function g() { return 1; } } passed &= g() === 1; passed &= h() === 2; { function h() { return 1; } } function h() { return 2; } passed &= h() === 1; return passed;
}
§labeled function statements
?
function(){
// Note: only available outside of strict mode. if (!this) return false; label: function foo() { return 2; } return foo() === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
// Note: only available outside of strict mode. if (!this) return false; label: function foo() { return 2; } return foo() === 2;
}
§function statements in if-statement clauses
?
function(){
// Note: only available outside of strict mode. if (!this) return false; if(true) function foo() { return 2; } if(false) {} else function bar() { return 3; } if(true) function baz() { return 4; } else {} if(false) function qux() { return 5; } else function qux() { return 6; } return foo() === 2 && bar() === 3 && baz() === 4 && qux() === 6;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
// Note: only available outside of strict mode. if (!this) return false; if(true) function foo() { return 2; } if(false) {} else function bar() { return 3; } if(true) function baz() { return 4; } else {} if(false) function qux() { return 5; } else function qux() { return 6; } return foo() === 2 && bar() === 3 && baz() === 4 && qux() === 6;
}

__proto__ in object literals

§basic support
?
function(){
return { __proto__ : [] } instanceof Array && !({ __proto__ : null } instanceof Object);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return { __proto__ : [] } instanceof Array && !({ __proto__ : null } instanceof Object);
}
§multiple __proto__ is an error
?
function(){
try { eval("({ __proto__ : [], __proto__: {} })"); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
function(){
try { eval("({ __proto__ : [], __proto__: {} })"); } catch(e) { return true; }
}
§not a computed property
?
function(){
if (!({ __proto__ : [] } instanceof Array)) { return false; } var a = "__proto__"; return !({ [a] : [] } instanceof Array);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
if (!({ __proto__ : [] } instanceof Array)) { return false; } var a = "__proto__"; return !({ [a] : [] } instanceof Array);
}
§not a shorthand property
?
function(){
if (!({ __proto__ : [] } instanceof Array)) { return false; } var __proto__ = []; return !({ __proto__ } instanceof Array);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
if (!({ __proto__ : [] } instanceof Array)) { return false; } var __proto__ = []; return !({ __proto__ } instanceof Array);
}
§not a shorthand method
?
function(){
if (!({ __proto__ : [] } instanceof Array)) { return false; } return !({ __proto__(){} } instanceof Function);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
function(){
if (!({ __proto__ : [] } instanceof Array)) { return false; } return !({ __proto__(){} } instanceof Function);
}

Object.prototype.__proto__

§get prototype
?
function(){
var A = function(){}; return (new A()).__proto__ === A.prototype;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var A = function(){}; return (new A()).__proto__ === A.prototype;
}
§set prototype
?
function(){
var o = {}; o.__proto__ = Array.prototype; return o instanceof Array;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var o = {}; o.__proto__ = Array.prototype; return o instanceof Array;
}
§absent from Object.create(null)
?
function(){
var o = Object.create(null), p = {}; o.__proto__ = p; return Object.getPrototypeOf(o) !== p;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
var o = Object.create(null), p = {}; o.__proto__ = p; return Object.getPrototypeOf(o) !== p;
}
§present in hasOwnProperty()
?
function(){
return Object.prototype.hasOwnProperty('__proto__');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return Object.prototype.hasOwnProperty('__proto__');
}
§correct property descriptor
?
function(){
var desc = Object.getOwnPropertyDescriptor(Object.prototype,"__proto__"); var A = function(){}; return (desc && "get" in desc && "set" in desc && desc.configurable && !desc.enumerable);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
var desc = Object.getOwnPropertyDescriptor(Object.prototype,"__proto__"); var A = function(){}; return (desc && "get" in desc && "set" in desc && desc.configurable && !desc.enumerable);
}
§present in Object.getOwnPropertyNames()
?
function(){
return Object.getOwnPropertyNames(Object.prototype).indexOf('__proto__') > -1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
function(){
return Object.getOwnPropertyNames(Object.prototype).indexOf('__proto__') > -1;
}

String.prototype HTML methods

§existence
?
function(){
var i, names = ["anchor", "big", "bold", "fixed", "fontcolor", "fontsize", "italics", "link", "small", "strike", "sub", "sup"]; for (i = 0; i < names.length; i++) { if (typeof String.prototype[names[i]] !== 'function') { return false; } } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var i, names = ["anchor", "big", "bold", "fixed", "fontcolor", "fontsize", "italics", "link", "small", "strike", "sub", "sup"]; for (i = 0; i < names.length; i++) { if (typeof String.prototype[names[i]] !== 'function') { return false; } } return true;
}
§tags' names are lowercase
?
function(){
var i, names = ["anchor", "big", "bold", "fixed", "fontcolor", "fontsize", "italics", "link", "small", "strike", "sub", "sup"]; for (i = 0; i < names.length; i++) { if (""[names[i]]().toLowerCase() !== ""[names[i]]()) { return false; } } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var i, names = ["anchor", "big", "bold", "fixed", "fontcolor", "fontsize", "italics", "link", "small", "strike", "sub", "sup"]; for (i = 0; i < names.length; i++) { if (""[names[i]]().toLowerCase() !== ""[names[i]]()) { return false; } } return true;
}
§quotes in arguments are escaped
?
function(){
var i, names = ["anchor", "fontcolor", "fontsize", "link"]; for (i = 0; i < names.length; i++) { if (""[names[i]]('"') !== ""[names[i]]('&' + 'quot;')) { return false; } } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var i, names = ["anchor", "fontcolor", "fontsize", "link"]; for (i = 0; i < names.length; i++) { if (""[names[i]]('"') !== ""[names[i]]('&' + 'quot;')) { return false; } } return true;
}

RegExp.prototype.compile

§basic functionality
?
function(){
if (typeof RegExp.prototype.compile !== 'function') return false var rx = /a/; rx.compile('b'); return rx.test('b');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
if (typeof RegExp.prototype.compile !== 'function') return false var rx = /a/; rx.compile('b'); return rx.test('b');
}
§returns this
?
function(){
var rx = /a/; return rx.compile('b') === rx;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var rx = /a/; return rx.compile('b') === rx;
}

RegExp syntax extensions

§hyphens in character sets
?
function(){
return /[\w-_]/.exec("-")[0] === "-";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return /[\w-_]/.exec("-")[0] === "-";
}
§invalid character escapes
?
function(){
return /\z/.exec("\\z")[0] === "z" && /[\z]/.exec("[\\z]")[0] === "z";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return /\z/.exec("\\z")[0] === "z" && /[\z]/.exec("[\\z]")[0] === "z";
}
§invalid control-character escapes
?
function(){
return /\c2/.exec("\\c2")[0] === "\\c2";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return /\c2/.exec("\\c2")[0] === "\\c2";
}
§invalid Unicode escapes
?
function(){
return /\u1/.exec("u1")[0] === "u1" && /[\u1]/.exec("u")[0] === "u";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return /\u1/.exec("u1")[0] === "u1" && /[\u1]/.exec("u")[0] === "u";
}
§invalid hexadecimal escapes
?
function(){
return /\x1/.exec("x1")[0] === "x1" && /[\x1]/.exec("x")[0] === "x";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return /\x1/.exec("x1")[0] === "x1" && /[\x1]/.exec("x")[0] === "x";
}
§incomplete patterns and quantifiers
?
function(){
return /x{1/.exec("x{1")[0] === "x{1" && /x]1/.exec("x]1")[0] === "x]1";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return /x{1/.exec("x{1")[0] === "x{1" && /x]1/.exec("x]1")[0] === "x]1";
}
§octal escape sequences
?
function(){
return /\041/.exec("!")[0] === "!" && /[\041]/.exec("!")[0] === "!";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return /\041/.exec("!")[0] === "!" && /[\041]/.exec("!")[0] === "!";
}
§invalid backreferences become octal escapes
?
function(){
return /\41/.exec("!")[0] === "!" && /[\41]/.exec("!")[0] === "!";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return /\41/.exec("!")[0] === "!" && /[\41]/.exec("!")[0] === "!";
}

§HTML-style comments
?
function(){
--> A comment <!-- Another comment var a = 3; <!-- Another comment return a === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
--> A comment <!-- Another comment var a = 3; <!-- Another comment return a === 3;
}

Node.js ES2016 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!100% complete100% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
100% complete100% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
100% complete100% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
100% complete100% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
100% complete100% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
100% complete100% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
100% complete100% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
100% complete100% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
100% complete100% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
100% complete100% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
100% complete100% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
100% complete100% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
100% complete100% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
100% complete100% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
100% complete100% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
100% complete100% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
100% complete100% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
100% complete100% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
100% complete100% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
100% complete100% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
100% complete100% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
100% complete100% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
100% complete100% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
100% complete100% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
100% complete100% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
100% complete100% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
100% complete100% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
100% complete100% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
100% complete100% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
100% complete100% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
100% complete100% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
100% complete100% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
100% complete100% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
100% complete100% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
100% complete100% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
100% complete100% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
100% complete100% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
100% complete100% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
100% complete100% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
100% complete100% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
100% complete100% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
100% complete100% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
100% complete100% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
100% complete78% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
78% complete78% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
35% complete7% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
7% complete7% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
7% complete0% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
0% complete0% complete

features

exponentiation (**) operator

§basic support
?
function(){
return 2 ** 3 === 8 && -(5 ** 2) === -25 && (-5) ** 2 === 25;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return 2 ** 3 === 8 && -(5 ** 2) === -25 && (-5) ** 2 === 25;
}
§assignment
?
function(){
var a = 2; a **= 3; return a === 8;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a = 2; a **= 3; return a === 8;
}
§early syntax error for unary negation without parens
?
function(){
if (2 ** 3 !== 8) { return false; } try { Function("-5 ** 2")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
if (2 ** 3 !== 8) { return false; } try { Function("-5 ** 2")(); } catch(e) { return true; }
}

Array.prototype.includes

§Array.prototype.includes
?
function(){
return [1, 2, 3].includes(1) && ![1, 2, 3].includes(4) && ![1, 2, 3].includes(1, 1) && [NaN].includes(NaN);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
return [1, 2, 3].includes(1) && ![1, 2, 3].includes(4) && ![1, 2, 3].includes(1, 1) && [NaN].includes(NaN);
}
§Array.prototype.includes handles sparse arrays
?
function(){
return [,].includes() && Array(1).includes();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
return [,].includes() && Array(1).includes();
}
§Array.prototype.includes is generic
?
function(){
var passed = 0; return [].includes.call({ get "0"() { passed = NaN; return 'foo'; }, get "11"() { passed += 1; return 0; }, get "19"() { passed += 1; return 'foo'; }, get "21"() { passed = NaN; return 'foo'; }, get length() { passed += 1; return 24; } }, 'foo', 6) === true && passed === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var passed = 0; return [].includes.call({ get "0"() { passed = NaN; return 'foo'; }, get "11"() { passed += 1; return 0; }, get "19"() { passed += 1; return 'foo'; }, get "21"() { passed = NaN; return 'foo'; }, get length() { passed += 1; return 24; } }, 'foo', 6) === true && passed === 3;
}
§%TypedArray%.prototype.includes
?
function(){
return [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array].every(function(TypedArray){ return new TypedArray([1, 2, 3]).includes(1) && !new TypedArray([1, 2, 3]).includes(4) && !new TypedArray([1, 2, 3]).includes(1, 1); });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
return [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array].every(function(TypedArray){ return new TypedArray([1, 2, 3]).includes(1) && !new TypedArray([1, 2, 3]).includes(4) && !new TypedArray([1, 2, 3]).includes(1, 1); });
}

misc

§generator functions can't be used with "new"
?
function(){
function * generator() { yield 3; } try { new generator(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Error
No
Error
Error
function(){
function * generator() { yield 3; } try { new generator(); } catch(e) { return true; }
}
§generator throw() caught by inner generator
?
function(){
function * generator() { yield * (function * () { try { yield 'foo'; } catch(e) { return; } }()); yield 'bar'; } var iter = generator(); iter.next(); return iter['throw']().value === 'bar';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
function * generator() { yield * (function * () { try { yield 'foo'; } catch(e) { return; } }()); yield 'bar'; } var iter = generator(); iter.next(); return iter['throw']().value === 'bar';
}
§strict fn w/ non-strict non-simple params is error
?
function(){
function foo(...a){} try { Function("function bar(...a){'use strict';}")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
No
Error
Error
Error
Error
function(){
function foo(...a){} try { Function("function bar(...a){'use strict';}")(); } catch(e) { return true; }
}
§nested rest destructuring, declarations
?
function(){
var [x, ...[y, ...z]] = [1,2,3,4]; return x === 1 && y === 2 && z + '' === '3,4';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var [x, ...[y, ...z]] = [1,2,3,4]; return x === 1 && y === 2 && z + '' === '3,4';
}
§nested rest destructuring, parameters
?
function(){
return function([x, ...[y, ...z]]) { return x === 1 && y === 2 && z + '' === '3,4'; }([1,2,3,4]);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return function([x, ...[y, ...z]]) { return x === 1 && y === 2 && z + '' === '3,4'; }([1,2,3,4]);
}
§Proxy, "enumerate" handler removed
?
function(){
var passed = true; var proxy = new Proxy({}, { enumerate: function() { passed = false; } }); for(var key in proxy); // Should not throw, nor execute the 'enumerate' method. return passed;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var passed = true; var proxy = new Proxy({}, { enumerate: function() { passed = false; } }); for(var key in proxy); // Should not throw, nor execute the 'enumerate' method. return passed;
}
§Proxy internal calls, Array.prototype.includes
?
function(){
// Array.prototype.includes -> Get -> [[Get]] var get = []; var p = new Proxy({length: 3, 0: '', 1: '', 2: '', 3: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.includes.call(p, {}); if (get + '' !== "length,0,1,2") return; get = []; p = new Proxy({length: 4, 0: NaN, 1: '', 2: NaN, 3: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.includes.call(p, NaN, 1); return (get + '' === "length,1,2");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Array.prototype.includes -> Get -> [[Get]] var get = []; var p = new Proxy({length: 3, 0: '', 1: '', 2: '', 3: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.includes.call(p, {}); if (get + '' !== "length,0,1,2") return; get = []; p = new Proxy({length: 4, 0: NaN, 1: '', 2: NaN, 3: ''}, { get: function(o, k) { get.push(k); return o[k]; }}); Array.prototype.includes.call(p, NaN, 1); return (get + '' === "length,1,2");
}

Node.js ES2017 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!100% complete100% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
100% complete100% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
100% complete100% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
100% complete100% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
100% complete100% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
100% complete100% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
100% complete100% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
100% complete100% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
100% complete100% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
100% complete100% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
100% complete100% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
100% complete100% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
100% complete100% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
100% complete100% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
100% complete100% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
100% complete100% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
100% complete100% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
100% complete100% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
100% complete100% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
100% complete100% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
100% complete100% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
100% complete100% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
100% complete100% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
100% complete100% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
100% complete100% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
100% complete100% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
100% complete100% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
100% complete100% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
100% complete100% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
100% complete100% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
100% complete100% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
100% complete100% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
100% complete100% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
100% complete100% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
100% complete100% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
98% complete98% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
98% complete98% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
98% complete98% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
73% complete67% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
73% complete67% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
65% complete65% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
54% complete51% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
54% complete26% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
21% complete17% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
17% complete17% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
17% complete17% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
17% complete17% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
17% complete17% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
10% complete10% complete

features

Object static methods

§Object.values
?
function(){
var obj = Object.create({ a: "qux", d: "qux" }); obj.a = "foo"; obj.b = "bar"; obj.c = "baz"; var v = Object.values(obj); return Array.isArray(v) && String(v) === "foo,bar,baz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = Object.create({ a: "qux", d: "qux" }); obj.a = "foo"; obj.b = "bar"; obj.c = "baz"; var v = Object.values(obj); return Array.isArray(v) && String(v) === "foo,bar,baz";
}
§Object.entries
?
function(){
var obj = Object.create({ a: "qux", d: "qux" }); obj.a = "foo"; obj.b = "bar"; obj.c = "baz"; var e = Object.entries(obj); return Array.isArray(e) && e.length === 3 && String(e[0]) === "a,foo" && String(e[1]) === "b,bar" && String(e[2]) === "c,baz";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var obj = Object.create({ a: "qux", d: "qux" }); obj.a = "foo"; obj.b = "bar"; obj.c = "baz"; var e = Object.entries(obj); return Array.isArray(e) && e.length === 3 && String(e[0]) === "a,foo" && String(e[1]) === "b,bar" && String(e[2]) === "c,baz";
}
§Object.getOwnPropertyDescriptors
?
function(){
var object = {a: 1}; var B = typeof Symbol === 'function' ? Symbol('b') : 'b'; object[B] = 2; var O = Object.defineProperty(object, 'c', {value: 3}); var D = Object.getOwnPropertyDescriptors(O); return D.a.value === 1 && D.a.enumerable === true && D.a.configurable === true && D.a.writable === true && D[B].value === 2 && D[B].enumerable === true && D[B].configurable === true && D[B].writable === true && D.c.value === 3 && D.c.enumerable === false && D.c.configurable === false && D.c.writable === false;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var object = {a: 1}; var B = typeof Symbol === 'function' ? Symbol('b') : 'b'; object[B] = 2; var O = Object.defineProperty(object, 'c', {value: 3}); var D = Object.getOwnPropertyDescriptors(O); return D.a.value === 1 && D.a.enumerable === true && D.a.configurable === true && D.a.writable === true && D[B].value === 2 && D[B].enumerable === true && D[B].configurable === true && D[B].writable === true && D.c.value === 3 && D.c.enumerable === false && D.c.configurable === false && D.c.writable === false;
}
§Object.getOwnPropertyDescriptors doesn't provide undefined descriptors
?
function(){
var P = new Proxy({a:1}, { getOwnPropertyDescriptor: function(t, k) {} }); return !Object.getOwnPropertyDescriptors(P).hasOwnProperty('a');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
No
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var P = new Proxy({a:1}, { getOwnPropertyDescriptor: function(t, k) {} }); return !Object.getOwnPropertyDescriptors(P).hasOwnProperty('a');
}

String padding

§String.prototype.padStart
?
function(){
return 'hello'.padStart(10) === ' hello' && 'hello'.padStart(10, '1234') === '12341hello' && 'hello'.padStart() === 'hello' && 'hello'.padStart(6, '123') === '1hello' && 'hello'.padStart(3) === 'hello' && 'hello'.padStart(3, '123') === 'hello';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return 'hello'.padStart(10) === ' hello' && 'hello'.padStart(10, '1234') === '12341hello' && 'hello'.padStart() === 'hello' && 'hello'.padStart(6, '123') === '1hello' && 'hello'.padStart(3) === 'hello' && 'hello'.padStart(3, '123') === 'hello';
}
§String.prototype.padEnd
?
function(){
return 'hello'.padEnd(10) === 'hello ' && 'hello'.padEnd(10, '1234') === 'hello12341' && 'hello'.padEnd() === 'hello' && 'hello'.padEnd(6, '123') === 'hello1' && 'hello'.padEnd(3) === 'hello' && 'hello'.padEnd(3, '123') === 'hello';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return 'hello'.padEnd(10) === 'hello ' && 'hello'.padEnd(10, '1234') === 'hello12341' && 'hello'.padEnd() === 'hello' && 'hello'.padEnd(6, '123') === 'hello1' && 'hello'.padEnd(3) === 'hello' && 'hello'.padEnd(3, '123') === 'hello';
}

trailing commas in function syntax

§in parameter lists
?
function(){
return typeof function f( a, b, ){} === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof function f( a, b, ){} === 'function';
}
§in argument lists
?
function(){
return Math.min(1,2,3,) === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Math.min(1,2,3,) === 1;
}

async functions

§return
?
function(){
async function a(){ return "foo"; } var p = a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function a(){ return "foo"; } var p = a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
§throw
?
function(){
async function a(){ throw "foo"; } var p = a(); if (!(p instanceof Promise)) { return false; } p.catch(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function a(){ throw "foo"; } var p = a(); if (!(p instanceof Promise)) { return false; } p.catch(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
§no line break between async and function
?
function(){
async function a(){} try { Function("async\n function a(){await 0}")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function a(){} try { Function("async\n function a(){await 0}")(); } catch(e) { return true; }
}
§no "prototype" property
?
function(){
async function a(){}; return !a.hasOwnProperty("prototype");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function a(){}; return !a.hasOwnProperty("prototype");
}
§await
?
function(){
(async function (){ await Promise.resolve(); var a1 = await new Promise(function(resolve) { setTimeout(resolve,800,"foo"); }); var a2 = await new Promise(function(resolve) { setTimeout(resolve,800,"bar"); }); if (a1 + a2 === "foobar") { asyncTestPassed(); } }());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function (){ await Promise.resolve(); var a1 = await new Promise(function(resolve) { setTimeout(resolve,800,"foo"); }); var a2 = await new Promise(function(resolve) { setTimeout(resolve,800,"bar"); }); if (a1 + a2 === "foobar") { asyncTestPassed(); } }());
}
§await, rejection
?
function(){
(async function (){ await Promise.resolve(); try { var a1 = await new Promise(function(_, reject) { setTimeout(reject,800,"foo"); }); } catch(e) { if (e === "foo") { asyncTestPassed(); } } }());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function (){ await Promise.resolve(); try { var a1 = await new Promise(function(_, reject) { setTimeout(reject,800,"foo"); }); } catch(e) { if (e === "foo") { asyncTestPassed(); } } }());
}
§must await a value
?
function(){
async function a(){ await Promise.resolve(); } try { Function("(async function a(){ await; }())")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function a(){ await Promise.resolve(); } try { Function("(async function a(){ await; }())")(); } catch(e) { return true; }
}
§can await non-Promise values
?
function(){
(async function (){ await Promise.resolve(); var e = await "foo"; if (e === "foo") { asyncTestPassed(); } }());
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function (){ await Promise.resolve(); var e = await "foo"; if (e === "foo") { asyncTestPassed(); } }());
}
§cannot await in parameters
?
function(){
async function a(){ await Promise.resolve(); } try { Function("(async function a(b = await Promise.resolve()){}())")(); } catch(e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function a(){ await Promise.resolve(); } try { Function("(async function a(b = await Promise.resolve()){}())")(); } catch(e) { return true; }
}
§async methods, object literals
?
function(){
var o = { async a(){ return await Promise.resolve("foo"); } }; var p = o.a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var o = { async a(){ return await Promise.resolve("foo"); } }; var p = o.a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
§async methods, classes
?
function(){
class C { async a(){ return await Promise.resolve("foo"); } }; var p = new C().a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { async a(){ return await Promise.resolve("foo"); } }; var p = new C().a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
§async arrow functions in methods, classes
?
function(){
function doSomething(callback) { callback(); } class C { a(){ doSomething(async () => { await 1; asyncTestPassed(); }); } }; var p = new C().a();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function doSomething(callback) { callback(); } class C { a(){ doSomething(async () => { await 1; asyncTestPassed(); }); } }; var p = new C().a();
}
§async arrow functions
?
function(){
var a = async () => await Promise.resolve("foo"); var p = a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a = async () => await Promise.resolve("foo"); var p = a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
§correct prototype chain
?
function(){
var asyncFunctionProto = Object.getPrototypeOf(async function (){}); return asyncFunctionProto !== function(){}.prototype && Object.getPrototypeOf(asyncFunctionProto) === Function.prototype;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var asyncFunctionProto = Object.getPrototypeOf(async function (){}); return asyncFunctionProto !== function(){}.prototype && Object.getPrototypeOf(asyncFunctionProto) === Function.prototype;
}
§async function prototype, Symbol.toStringTag
?
function(){
return Object.getPrototypeOf(async function (){})[Symbol.toStringTag] === "AsyncFunction";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Object.getPrototypeOf(async function (){})[Symbol.toStringTag] === "AsyncFunction";
}
§async function constructor
?
function(){
var a = async function (){}.constructor("return 'foo';"); var p = a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a = async function (){}.constructor("return 'foo';"); var p = a(); if (!(p instanceof Promise)) { return false; } p.then(function(result) { if (result === "foo") { asyncTestPassed(); } });
}

shared memory and atomics

§SharedArrayBuffer
?
function(){
return typeof SharedArrayBuffer === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
return typeof SharedArrayBuffer === 'function';
}
§SharedArrayBuffer[Symbol.species]
?
function(){
return SharedArrayBuffer[Symbol.species] === SharedArrayBuffer;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return SharedArrayBuffer[Symbol.species] === SharedArrayBuffer;
}
§SharedArrayBuffer.prototype.byteLength
?
function(){
return 'byteLength' in SharedArrayBuffer.prototype;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return 'byteLength' in SharedArrayBuffer.prototype;
}
§SharedArrayBuffer.prototype.slice
?
function(){
return typeof SharedArrayBuffer.prototype.slice === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof SharedArrayBuffer.prototype.slice === 'function';
}
§SharedArrayBuffer.prototype[Symbol.toStringTag]
?
function(){
return SharedArrayBuffer.prototype[Symbol.toStringTag] === 'SharedArrayBuffer';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return SharedArrayBuffer.prototype[Symbol.toStringTag] === 'SharedArrayBuffer';
}
§Atomics.add
?
function(){
return typeof Atomics.add === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.add === 'function';
}
§Atomics.and
?
function(){
return typeof Atomics.and === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.and === 'function';
}
§Atomics.compareExchange
?
function(){
return typeof Atomics.compareExchange === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.compareExchange === 'function';
}
§Atomics.exchange
?
function(){
return typeof Atomics.exchange === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.exchange === 'function';
}
§Atomics.wait
?
function(){
return typeof Atomics.wait === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.wait === 'function';
}
§Atomics.notify
?
function(){
return typeof Atomics.notify === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.notify === 'function';
}
§Atomics.isLockFree
?
function(){
return typeof Atomics.isLockFree === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.isLockFree === 'function';
}
§Atomics.load
?
function(){
return typeof Atomics.load === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.load === 'function';
}
§Atomics.or
?
function(){
return typeof Atomics.or === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.or === 'function';
}
§Atomics.store
?
function(){
return typeof Atomics.store === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.store === 'function';
}
§Atomics.sub
?
function(){
return typeof Atomics.sub === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.sub === 'function';
}
§Atomics.xor
?
function(){
return typeof Atomics.xor === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof Atomics.xor === 'function';
}

misc

§RegExp "u" flag, case folding
?
function(){
return "ſ".match(/\w/iu) && !"ſ".match(/\W/iu) && "\u212a".match(/\w/iu) && !"\u212a".match(/\W/iu) && "\u212a".match(/.\b/iu) && "ſ".match(/.\b/iu) && !"\u212a".match(/.\B/iu) && !"ſ".match(/.\B/iu);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return "ſ".match(/\w/iu) && !"ſ".match(/\W/iu) && "\u212a".match(/\w/iu) && !"\u212a".match(/\W/iu) && "\u212a".match(/.\b/iu) && "ſ".match(/.\b/iu) && !"\u212a".match(/.\B/iu) && !"ſ".match(/.\B/iu);
}
§arguments.caller removed
?
function(){
return (function(){ 'use strict'; return !Object.getOwnPropertyDescriptor(arguments,'caller'); })();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
return (function(){ 'use strict'; return !Object.getOwnPropertyDescriptor(arguments,'caller'); })();
}

annex b

Object.prototype getter/setter methods

§__defineGetter__
?
function(){
var obj = {}; function bar() { return "bar"; } Object.prototype.__defineGetter__.call(obj, "foo", bar); var prop = Object.getOwnPropertyDescriptor(obj, "foo"); return prop.get === bar && !prop.writable && prop.configurable && prop.enumerable;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var obj = {}; function bar() { return "bar"; } Object.prototype.__defineGetter__.call(obj, "foo", bar); var prop = Object.getOwnPropertyDescriptor(obj, "foo"); return prop.get === bar && !prop.writable && prop.configurable && prop.enumerable;
}
§__defineGetter__, symbols
?
function(){
var obj = {}; var sym = Symbol(); function bar() { return "bar"; } Object.prototype.__defineGetter__.call(obj, sym, bar); var prop = Object.getOwnPropertyDescriptor(obj, sym); return prop.get === bar && !prop.writable && prop.configurable && prop.enumerable;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var obj = {}; var sym = Symbol(); function bar() { return "bar"; } Object.prototype.__defineGetter__.call(obj, sym, bar); var prop = Object.getOwnPropertyDescriptor(obj, sym); return prop.get === bar && !prop.writable && prop.configurable && prop.enumerable;
}
§__defineGetter__, ToObject(this)
?
function(){
var key = '__accessors_test__'; __defineGetter__.call(1, key, function(){}); try { __defineGetter__.call(null, key, function(){}); } catch(e){ return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var key = '__accessors_test__'; __defineGetter__.call(1, key, function(){}); try { __defineGetter__.call(null, key, function(){}); } catch(e){ return true; }
}
§__defineSetter__
?
function(){
var obj = {}; function bar() {} Object.prototype.__defineSetter__.call(obj, "foo", bar); var prop = Object.getOwnPropertyDescriptor(obj, "foo"); return prop.set === bar && !prop.writable && prop.configurable && prop.enumerable;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var obj = {}; function bar() {} Object.prototype.__defineSetter__.call(obj, "foo", bar); var prop = Object.getOwnPropertyDescriptor(obj, "foo"); return prop.set === bar && !prop.writable && prop.configurable && prop.enumerable;
}
§__defineSetter__, symbols
?
function(){
var obj = {}; var sym = Symbol(); function bar(baz) {} Object.prototype.__defineSetter__.call(obj, sym, bar); var prop = Object.getOwnPropertyDescriptor(obj, sym); return prop.set === bar && !prop.writable && prop.configurable && prop.enumerable;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var obj = {}; var sym = Symbol(); function bar(baz) {} Object.prototype.__defineSetter__.call(obj, sym, bar); var prop = Object.getOwnPropertyDescriptor(obj, sym); return prop.set === bar && !prop.writable && prop.configurable && prop.enumerable;
}
§__defineSetter__, ToObject(this)
?
function(){
var key = '__accessors_test__'; __defineSetter__.call(1, key, function(){}); try { __defineSetter__.call(null, key, function(){}); } catch(e){ return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var key = '__accessors_test__'; __defineSetter__.call(1, key, function(){}); try { __defineSetter__.call(null, key, function(){}); } catch(e){ return true; }
}
§__lookupGetter__
?
function(){
var obj = { get foo() { return "bar"}, qux: 1 }; var foo = Object.prototype.__lookupGetter__.call(obj, "foo"); return foo() === "bar" && Object.prototype.__lookupGetter__.call(obj, "qux") === void undefined && Object.prototype.__lookupGetter__.call(obj, "baz") === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var obj = { get foo() { return "bar"}, qux: 1 }; var foo = Object.prototype.__lookupGetter__.call(obj, "foo"); return foo() === "bar" && Object.prototype.__lookupGetter__.call(obj, "qux") === void undefined && Object.prototype.__lookupGetter__.call(obj, "baz") === void undefined;
}
§__lookupGetter__, prototype chain
?
function(){
var obj = { get foo() { return "bar"}, qux: 1 }; var foo = Object.prototype.__lookupGetter__.call(Object.create(obj), "foo"); return foo() === "bar" && Object.prototype.__lookupGetter__.call(obj, "qux") === void undefined && Object.prototype.__lookupGetter__.call(obj, "baz") === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var obj = { get foo() { return "bar"}, qux: 1 }; var foo = Object.prototype.__lookupGetter__.call(Object.create(obj), "foo"); return foo() === "bar" && Object.prototype.__lookupGetter__.call(obj, "qux") === void undefined && Object.prototype.__lookupGetter__.call(obj, "baz") === void undefined;
}
§__lookupGetter__, symbols
?
function(){
var sym = Symbol(); var sym2 = Symbol(); var obj = {}; Object.defineProperty(obj, sym, { get: function() { return "bar"; }}); Object.defineProperty(obj, sym2, { value: 1 }); var foo = Object.prototype.__lookupGetter__.call(obj, sym); return foo() === "bar" && Object.prototype.__lookupGetter__.call(obj, sym2) === void undefined && Object.prototype.__lookupGetter__.call(obj, Symbol()) === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var sym = Symbol(); var sym2 = Symbol(); var obj = {}; Object.defineProperty(obj, sym, { get: function() { return "bar"; }}); Object.defineProperty(obj, sym2, { value: 1 }); var foo = Object.prototype.__lookupGetter__.call(obj, sym); return foo() === "bar" && Object.prototype.__lookupGetter__.call(obj, sym2) === void undefined && Object.prototype.__lookupGetter__.call(obj, Symbol()) === void undefined;
}
§__lookupGetter__, ToObject(this)
?
function(){
__lookupGetter__.call(1, 'key'); try { __lookupGetter__.call(null, 'key'); } catch(e){ return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
__lookupGetter__.call(1, 'key'); try { __lookupGetter__.call(null, 'key'); } catch(e){ return true; }
}
§__lookupGetter__, data properties can shadow accessors
?
function(){
var a = { }; var b = Object.create(a); b.foo = 1; a.__defineGetter__("foo", function () {}) return b.__lookupGetter__("foo") === void undefined
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var a = { }; var b = Object.create(a); b.foo = 1; a.__defineGetter__("foo", function () {}) return b.__lookupGetter__("foo") === void undefined
}
§__lookupSetter__
?
function(){
var obj = { set foo(baz) { return "bar"; }, qux: 1 }; var foo = Object.prototype.__lookupSetter__.call(obj, "foo"); return foo() === "bar" && Object.prototype.__lookupSetter__.call(obj, "qux") === void undefined && Object.prototype.__lookupSetter__.call(obj, "baz") === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var obj = { set foo(baz) { return "bar"; }, qux: 1 }; var foo = Object.prototype.__lookupSetter__.call(obj, "foo"); return foo() === "bar" && Object.prototype.__lookupSetter__.call(obj, "qux") === void undefined && Object.prototype.__lookupSetter__.call(obj, "baz") === void undefined;
}
§__lookupSetter__, prototype chain
?
function(){
var obj = { set foo(baz) { return "bar"; }, qux: 1 }; var foo = Object.prototype.__lookupSetter__.call(Object.create(obj), "foo"); return foo() === "bar" && Object.prototype.__lookupSetter__.call(obj, "qux") === void undefined && Object.prototype.__lookupSetter__.call(obj, "baz") === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var obj = { set foo(baz) { return "bar"; }, qux: 1 }; var foo = Object.prototype.__lookupSetter__.call(Object.create(obj), "foo"); return foo() === "bar" && Object.prototype.__lookupSetter__.call(obj, "qux") === void undefined && Object.prototype.__lookupSetter__.call(obj, "baz") === void undefined;
}
§__lookupSetter__, symbols
?
function(){
var sym = Symbol(); var sym2 = Symbol(); var obj = {}; Object.defineProperty(obj, sym, { set: function(baz) { return "bar"; }}); Object.defineProperty(obj, sym2, { value: 1 }); var foo = Object.prototype.__lookupSetter__.call(obj, sym); return foo() === "bar" && Object.prototype.__lookupSetter__.call(obj, sym2) === void undefined && Object.prototype.__lookupSetter__.call(obj, Symbol()) === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
function(){
var sym = Symbol(); var sym2 = Symbol(); var obj = {}; Object.defineProperty(obj, sym, { set: function(baz) { return "bar"; }}); Object.defineProperty(obj, sym2, { value: 1 }); var foo = Object.prototype.__lookupSetter__.call(obj, sym); return foo() === "bar" && Object.prototype.__lookupSetter__.call(obj, sym2) === void undefined && Object.prototype.__lookupSetter__.call(obj, Symbol()) === void undefined;
}
§__lookupSetter__, ToObject(this)
?
function(){
__lookupSetter__.call(1, 'key'); try { __lookupSetter__.call(null, 'key'); } catch(e){ return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
__lookupSetter__.call(1, 'key'); try { __lookupSetter__.call(null, 'key'); } catch(e){ return true; }
}
§__lookupSetter__, data properties can shadow accessors
?
function(){
var a = { }; var b = Object.create(a); b.foo = 1; a.__defineSetter__("foo", function () {}) return b.__lookupSetter__("foo") === void undefined
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var a = { }; var b = Object.create(a); b.foo = 1; a.__defineSetter__("foo", function () {}) return b.__lookupSetter__("foo") === void undefined
}

Proxy internal calls, getter/setter methods

§__defineGetter__
?
function(){
// Object.prototype.__defineGetter__ -> DefinePropertyOrThrow -> [[DefineOwnProperty]] var def = []; var p = new Proxy({}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }}); Object.prototype.__defineGetter__.call(p, "foo", Object); return def + '' === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.prototype.__defineGetter__ -> DefinePropertyOrThrow -> [[DefineOwnProperty]] var def = []; var p = new Proxy({}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }}); Object.prototype.__defineGetter__.call(p, "foo", Object); return def + '' === "foo";
}
§__defineSetter__
?
function(){
// Object.prototype.__defineSetter__ -> DefinePropertyOrThrow -> [[DefineOwnProperty]] var def = []; var p = new Proxy({}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }}); Object.prototype.__defineSetter__.call(p, "foo", Object); return def + '' === "foo";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.prototype.__defineSetter__ -> DefinePropertyOrThrow -> [[DefineOwnProperty]] var def = []; var p = new Proxy({}, { defineProperty: function(o, v, desc) { def.push(v); Object.defineProperty(o, v, desc); return true; }}); Object.prototype.__defineSetter__.call(p, "foo", Object); return def + '' === "foo";
}
§__lookupGetter__
?
function(){
// Object.prototype.__lookupGetter__ -> [[GetOwnProperty]] // Object.prototype.__lookupGetter__ -> [[GetPrototypeOf]] var gopd = []; var gpo = false; var p = new Proxy({}, { getPrototypeOf: function(o) { gpo = true; return Object.getPrototypeOf(o); }, getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); } }); Object.prototype.__lookupGetter__.call(p, "foo"); return gopd + '' === "foo" && gpo;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.prototype.__lookupGetter__ -> [[GetOwnProperty]] // Object.prototype.__lookupGetter__ -> [[GetPrototypeOf]] var gopd = []; var gpo = false; var p = new Proxy({}, { getPrototypeOf: function(o) { gpo = true; return Object.getPrototypeOf(o); }, getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); } }); Object.prototype.__lookupGetter__.call(p, "foo"); return gopd + '' === "foo" && gpo;
}
§__lookupSetter__
?
function(){
// Object.prototype.__lookupSetter__ -> [[GetOwnProperty]] // Object.prototype.__lookupSetter__ -> [[GetPrototypeOf]] var gopd = []; var gpo = false; var p = new Proxy({}, { getPrototypeOf: function(o) { gpo = true; return Object.getPrototypeOf(o); }, getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); } }); Object.prototype.__lookupSetter__.call(p, "foo"); return gopd + '' === "foo" && gpo;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
// Object.prototype.__lookupSetter__ -> [[GetOwnProperty]] // Object.prototype.__lookupSetter__ -> [[GetPrototypeOf]] var gopd = []; var gpo = false; var p = new Proxy({}, { getPrototypeOf: function(o) { gpo = true; return Object.getPrototypeOf(o); }, getOwnPropertyDescriptor: function(o, v) { gopd.push(v); return Object.getOwnPropertyDescriptor(o, v); } }); Object.prototype.__lookupSetter__.call(p, "foo"); return gopd + '' === "foo" && gpo;
}

§assignments allowed in for-in head in non-strict mode
?
function(){
for (var i = 0 in {}) {} return i === 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
for (var i = 0 in {}) {} return i === 0;
}

Node.js ES2018 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!100% complete100% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
100% complete100% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
95% complete95% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
95% complete95% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
95% complete95% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
95% complete95% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
90% complete90% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
95% complete95% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
90% complete90% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
90% complete90% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
85% complete85% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
90% complete90% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
85% complete85% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
85% complete85% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
85% complete85% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
85% complete85% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
85% complete85% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
85% complete85% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
85% complete85% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
90% complete90% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
85% complete85% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
85% complete85% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
85% complete85% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
80% complete80% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
80% complete80% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
85% complete85% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
80% complete80% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
80% complete80% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
80% complete80% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
80% complete80% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
70% complete70% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
65% complete65% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
70% complete70% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
60% complete60% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
60% complete60% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
60% complete60% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
60% complete60% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
45% complete25% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
35% complete10% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
35% complete10% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
20% complete0% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
5% complete0% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
5% complete0% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
5% complete0% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
5% complete0% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
0% complete0% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
0% complete0% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
0% complete0% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
0% complete0% complete

features

object rest/spread properties

§object rest properties
?
function(){
var {a, ...rest} = {a: 1, b: 2, c: 3}; return a === 1 && rest.a === void undefined && rest.b === 2 && rest.c === 3;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var {a, ...rest} = {a: 1, b: 2, c: 3}; return a === 1 && rest.a === void undefined && rest.b === 2 && rest.c === 3;
}
§object spread properties
?
function(){
var spread = {b: 2, c: 3}; var O = {a: 1, ...spread}; return O !== spread && (O.a + O.b + O.c) === 6;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var spread = {b: 2, c: 3}; var O = {a: 1, ...spread}; return O !== spread && (O.a + O.b + O.c) === 6;
}

Promise.prototype.finally

§basic support
?
function(){
var p1 = Promise.resolve("foo"); var p2 = Promise.reject("bar"); var score = 0; function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "bar"); check(); } function finallyFn() { score += (arguments.length === 0); check(); } p1.then(thenFn); p1.finally(finallyFn); p1.finally(function() { // should return a new Promise score += p1.finally() !== p1; check(); }); p2.catch(catchFn); p2.finally(finallyFn); function check() { if (score === 5) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var p1 = Promise.resolve("foo"); var p2 = Promise.reject("bar"); var score = 0; function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "bar"); check(); } function finallyFn() { score += (arguments.length === 0); check(); } p1.then(thenFn); p1.finally(finallyFn); p1.finally(function() { // should return a new Promise score += p1.finally() !== p1; check(); }); p2.catch(catchFn); p2.finally(finallyFn); function check() { if (score === 5) asyncTestPassed(); }
}
§don't change resolution value
?
function(){
var score = 0; function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "bar"); check(); } function finallyFn() { score++; check(); return Promise.resolve("foobar"); } Promise.resolve("foo").finally(finallyFn).then(thenFn); Promise.reject("bar").finally(finallyFn).catch(catchFn); function check() { if (score === 4) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var score = 0; function thenFn(result) { score += (result === "foo"); check(); } function catchFn(result) { score += (result === "bar"); check(); } function finallyFn() { score++; check(); return Promise.resolve("foobar"); } Promise.resolve("foo").finally(finallyFn).then(thenFn); Promise.reject("bar").finally(finallyFn).catch(catchFn); function check() { if (score === 4) asyncTestPassed(); }
}
§change rejection value
?
function(){
var score = 0; Promise .reject("foobar") .finally(function() { return Promise.reject("foo"); }) .catch(function(result) { score += (result === "foo"); check(); return Promise.reject("foobar"); }) .finally(function() { throw new Error('bar'); }) .catch(function(result) { score += (result.message === "bar"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var score = 0; Promise .reject("foobar") .finally(function() { return Promise.reject("foo"); }) .catch(function(result) { score += (result === "foo"); check(); return Promise.reject("foobar"); }) .finally(function() { throw new Error('bar'); }) .catch(function(result) { score += (result.message === "bar"); check(); }); function check() { if (score === 2) asyncTestPassed(); }
}

§s (dotAll) flag for regular expressions
?
function(){
const regex = /foo.bar/s; return regex.test('foo\nbar');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const regex = /foo.bar/s; return regex.test('foo\nbar');
}
§RegExp named capture groups
?
function(){
var result = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/.exec('2016-03-11'); return result.groups.year === '2016' && result.groups.month === '03' && result.groups.day === '11' && result[0] === '2016-03-11' && result[1] === '2016' && result[2] === '03' && result[3] === '11';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var result = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/.exec('2016-03-11'); return result.groups.year === '2016' && result.groups.month === '03' && result.groups.day === '11' && result[0] === '2016-03-11' && result[1] === '2016' && result[2] === '03' && result[3] === '11';
}
§RegExp Lookbehind Assertions
?
function(){
return /(?<=a)b/.test('ab') && /(?<!a)b/.test('cb') && !/(?<=a)b/.test('b');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /(?<=a)b/.test('ab') && /(?<!a)b/.test('cb') && !/(?<=a)b/.test('b');
}

RegExp Unicode Property Escapes

§basic
?
function(){
const regexGreekSymbol = /\p{Script=Greek}/u; return regexGreekSymbol.test('π');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const regexGreekSymbol = /\p{Script=Greek}/u; return regexGreekSymbol.test('π');
}
§Unicode 11
?
function(){
return /\p{Extended_Pictographic}/u.test("\xA9") && /\p{Emoji}/u.test("🥰");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /\p{Extended_Pictographic}/u.test("\xA9") && /\p{Emoji}/u.test("🥰");
}
§Unicode 12
?
function(){
return /\p{Script=Elymaic}/u.test("\u{10fe0}") && /\p{Emoji}/u.test("🥱");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /\p{Script=Elymaic}/u.test("\u{10fe0}") && /\p{Emoji}/u.test("🥱");
}
§Unicode 12.1
?
function(){
return /\p{Other_Symbol}/u.test("\u32FF");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Yes
Yes
No
No
No
No
No
No
No
No
Error
No
Error
No
Error
No
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /\p{Other_Symbol}/u.test("\u32FF");
}
§Unicode 13
?
function(){
return /\p{Script=Chorasmian}/u.test("\u{10fb0}") && /\p{Emoji}/u.test("🥲");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /\p{Script=Chorasmian}/u.test("\u{10fb0}") && /\p{Emoji}/u.test("🥲");
}
§Unicode 14
?
function(){
return /\p{Script=Vithkuqi}/u.test("\u{10570}") && /\p{Emoji}/u.test("🫠");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /\p{Script=Vithkuqi}/u.test("\u{10570}") && /\p{Emoji}/u.test("🫠");
}
§Unicode 15
?
function(){
return /\p{Script=Kawi}/u.test("\u{11f00}") && /\p{Emoji}/u.test("🫨");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /\p{Script=Kawi}/u.test("\u{11f00}") && /\p{Emoji}/u.test("🫨");
}
§Unicode 15.1
?
function(){
return /\p{Unified_Ideograph}/u.test("\u{2ebf0}");
}
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
No
Error
No
Error
No
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /\p{Unified_Ideograph}/u.test("\u{2ebf0}");
}

Asynchronous Iterators

§async generators
?
function(){
async function*generator(){ yield 42; } var iterator = generator(); iterator.next().then(function(step){ if(iterator[Symbol.asyncIterator]() === iterator && step.done === false && step.value === 42)asyncTestPassed(); });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function*generator(){ yield 42; } var iterator = generator(); iterator.next().then(function(step){ if(iterator[Symbol.asyncIterator]() === iterator && step.done === false && step.value === 42)asyncTestPassed(); });
}
§for-await-of loops
?
function(){
var asyncIterable = {}; asyncIterable[Symbol.asyncIterator] = function(){ var i = 0; return { next: function(){ switch(++i){ case 1: return Promise.resolve({done: false, value: 'a'}); case 2: return Promise.resolve({done: false, value: 'b'}); } return Promise.resolve({done: true}); } }; }; (async function(){ var result = ''; for await(var value of asyncIterable)result += value; if(result === 'ab')asyncTestPassed(); })();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var asyncIterable = {}; asyncIterable[Symbol.asyncIterator] = function(){ var i = 0; return { next: function(){ switch(++i){ case 1: return Promise.resolve({done: false, value: 'a'}); case 2: return Promise.resolve({done: false, value: 'b'}); } return Promise.resolve({done: true}); } }; }; (async function(){ var result = ''; for await(var value of asyncIterable)result += value; if(result === 'ab')asyncTestPassed(); })();
}

misc

§Proxy "ownKeys" handler, duplicate keys for non-extensible targets
?
function(){
var p = new Proxy({}, { ownKeys() { return ["a", "a"]; } }); try { Object.keys(p); } catch (e) { return e instanceof TypeError } return false;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var p = new Proxy({}, { ownKeys() { return ["a", "a"]; } }); try { Object.keys(p); } catch (e) { return e instanceof TypeError } return false;
}
§template literal revision
?
function(){
function tag(strings, a) { return strings[0] === void 0 && strings.raw[0] === "\\01\\1\\xg\\xAg\\u0\\u0g\\u00g\\u000g\\u{g\\u{0\\u{110000}" && strings[1] === "\0" && strings.raw[1] === "\\0" && a === 0; } return tag`\01\1\xg\xAg\u0\u0g\u00g\u000g\u{g\u{0\u{110000}${0}\0`;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function tag(strings, a) { return strings[0] === void 0 && strings.raw[0] === "\\01\\1\\xg\\xAg\\u0\\u0g\\u00g\\u000g\\u{g\\u{0\\u{110000}" && strings[1] === "\0" && strings.raw[1] === "\\0" && a === 0; } return tag`\01\1\xg\xAg\u0\u0g\u00g\u000g\u{g\u{0\u{110000}${0}\0`;
}

Node.js ES2019 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!100% complete100% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
100% complete100% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
100% complete100% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
100% complete100% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
100% complete100% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
100% complete100% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
100% complete100% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
100% complete100% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
100% complete100% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
100% complete100% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
100% complete100% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
100% complete100% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
100% complete100% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
100% complete100% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
100% complete100% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
100% complete100% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
100% complete100% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
100% complete100% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
100% complete100% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
100% complete100% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
100% complete100% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
100% complete100% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
100% complete100% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
100% complete100% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
100% complete100% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
100% complete100% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
100% complete100% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
100% complete100% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
100% complete100% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
100% complete100% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
100% complete100% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
87% complete87% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
66% complete66% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
66% complete66% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
66% complete66% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
66% complete66% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
66% complete66% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
37% complete25% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
37% complete25% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
37% complete25% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
25% complete25% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
25% complete25% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
25% complete25% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
25% complete25% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
25% complete25% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
25% complete16% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
16% complete16% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
16% complete12% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
12% complete12% complete

features

Symbol.prototype.description

§basic
?
function(){
return Symbol('foo').description === 'foo';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
function(){
return Symbol('foo').description === 'foo';
}
§empty description
?
function(){
return Symbol('').description === '';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
function(){
return Symbol('').description === '';
}
§undefined description
?
function(){
return Symbol.prototype.hasOwnProperty('description') && Symbol().description === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
function(){
return Symbol.prototype.hasOwnProperty('description') && Symbol().description === void undefined;
}

§Object.fromEntries
?
function(){
var object = Object.fromEntries(new Map([['foo', 42], ['bar', 23]])); return object.foo === 42 && object.bar === 23;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var object = Object.fromEntries(new Map([['foo', 42], ['bar', 23]])); return object.foo === 42 && object.bar === 23;
}

string trimming

§String.prototype.trimLeft
?
function(){
return ' \t \n abc \t\n'.trimLeft() === 'abc \t\n';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return ' \t \n abc \t\n'.trimLeft() === 'abc \t\n';
}
§String.prototype.trimRight
?
function(){
return ' \t \n abc \t\n'.trimRight() === ' \t \n abc';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return ' \t \n abc \t\n'.trimRight() === ' \t \n abc';
}
§String.prototype.trimStart
?
function(){
return ' \t \n abc \t\n'.trimStart() === 'abc \t\n';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return ' \t \n abc \t\n'.trimStart() === 'abc \t\n';
}
§String.prototype.trimEnd
?
function(){
return ' \t \n abc \t\n'.trimEnd() === ' \t \n abc';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return ' \t \n abc \t\n'.trimEnd() === ' \t \n abc';
}

Array.prototype.{flat, flatMap}

§Array.prototype.flat
?
function(){
return [1, [2, 3], [4, [5, 6]]].flat().join('') === '12345,6';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return [1, [2, 3], [4, [5, 6]]].flat().join('') === '12345,6';
}
§Array.prototype.flatMap
?
function(){
return [{a: 1, b: 2}, {a: 3, b: 4}].flatMap(function (it) { return [it.a, it.b]; }).join('') === '1234';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return [{a: 1, b: 2}, {a: 3, b: 4}].flatMap(function (it) { return [it.a, it.b]; }).join('') === '1234';
}
§flat and flatMap in Array.prototype[@@unscopables]
?
function(){
return Array.prototype[Symbol.unscopables].flat && Array.prototype[Symbol.unscopables].flatMap;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
function(){
return Array.prototype[Symbol.unscopables].flat && Array.prototype[Symbol.unscopables].flatMap;
}

misc

optional catch binding

§basic
?
function(){
try { throw new Error(); } catch { return true; } return false;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
try { throw new Error(); } catch { return true; } return false;
}
§await
?
function(){
(async function (){ try { await Promise.reject(); } catch { asyncTestPassed(); } })();
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function (){ try { await Promise.reject(); } catch { asyncTestPassed(); } })();
}
§yield
?
function(){
function *foo() { try { yield; } catch { return true; } } var it = foo(); it.next(); return it.throw().value;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function *foo() { try { yield; } catch { return true; } } var it = foo(); it.next(); return it.throw().value;
}

Function.prototype.toString revision

§functions created with the Function constructor
?
function(){
var fn = Function('a', ' /\x2A a \x2A/ b, c /\x2A b \x2A/ //', '/\x2A c \x2A/ ; /\x2A d \x2A/ //'); var str = 'function anonymous(a, /\x2A a \x2A/ b, c /\x2A b \x2A/ //\n) {\n/\x2A c \x2A/ ; /\x2A d \x2A/ //\n}'; return fn + '' === str;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
function(){
var fn = Function('a', ' /\x2A a \x2A/ b, c /\x2A b \x2A/ //', '/\x2A c \x2A/ ; /\x2A d \x2A/ //'); var str = 'function anonymous(a, /\x2A a \x2A/ b, c /\x2A b \x2A/ //\n) {\n/\x2A c \x2A/ ; /\x2A d \x2A/ //\n}'; return fn + '' === str;
}
§arrows
?
function(){
var str = 'a => b'; return eval('(' + str + ')') + '' === str;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
function(){
var str = 'a => b'; return eval('(' + str + ')') + '' === str;
}
§[native code]
?
function(){
const NATIVE_EVAL_RE = /\bfunction\b[\s\S]*\beval\b[\s\S]*\([\s\S]*\)[\s\S]*\{[\s\S]*\[[\s\S]*\bnative\b[\s\S]+\bcode\b[\s\S]*\][\s\S]*\}/; return NATIVE_EVAL_RE.test(eval + '');
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
const NATIVE_EVAL_RE = /\bfunction\b[\s\S]*\beval\b[\s\S]*\([\s\S]*\)[\s\S]*\{[\s\S]*\[[\s\S]*\bnative\b[\s\S]+\bcode\b[\s\S]*\][\s\S]*\}/; return NATIVE_EVAL_RE.test(eval + '');
}
§class expression with implicit constructor
?
function(){
var str = 'class A {}'; return eval('(' + str + ')') + '' === str;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var str = 'class A {}'; return eval('(' + str + ')') + '' === str;
}
§class expression with explicit constructor
?
function(){
var str = 'class /\x2A a \x2A/ A /\x2A b \x2A/ extends /\x2A c \x2A/ function B(){} /\x2A d \x2A/ { /\x2A e \x2A/ constructor /\x2A f \x2A/ ( /\x2A g \x2A/ ) /\x2A h \x2A/ { /\x2A i \x2A/ ; /\x2A j \x2A/ } /\x2A k \x2A/ m /\x2A l \x2A/ ( /\x2A m \x2A/ ) /\x2A n \x2A/ { /\x2A o \x2A/ } /\x2A p \x2A/ }'; return eval('(/\x2A before \x2A/' + str + '/\x2A after \x2A/)') + '' === str;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
function(){
var str = 'class /\x2A a \x2A/ A /\x2A b \x2A/ extends /\x2A c \x2A/ function B(){} /\x2A d \x2A/ { /\x2A e \x2A/ constructor /\x2A f \x2A/ ( /\x2A g \x2A/ ) /\x2A h \x2A/ { /\x2A i \x2A/ ; /\x2A j \x2A/ } /\x2A k \x2A/ m /\x2A l \x2A/ ( /\x2A m \x2A/ ) /\x2A n \x2A/ { /\x2A o \x2A/ } /\x2A p \x2A/ }'; return eval('(/\x2A before \x2A/' + str + '/\x2A after \x2A/)') + '' === str;
}
§unicode escape sequences in identifiers
?
function(){
var str = 'function \\u0061(\\u{62}, \\u0063) { \\u0062 = \\u{00063}; return b; }'; return eval('(/\x2A before \x2A/' + str + '/\x2A after \x2A/)') + '' === str;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
Error
Error
function(){
var str = 'function \\u0061(\\u{62}, \\u0063) { \\u0062 = \\u{00063}; return b; }'; return eval('(/\x2A before \x2A/' + str + '/\x2A after \x2A/)') + '' === str;
}
§methods and computed property names
?
function(){
var str = '[ /\x2A a \x2A/ "f" /\x2A b \x2A/ ] /\x2A c \x2A/ ( /\x2A d \x2A/ ) /\x2A e \x2A/ { /\x2A f \x2A/ }'; return eval('({ /\x2A before \x2A/' + str + '/\x2A after \x2A/ }.f)') + '' === str;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
Flag
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
Error
Error
function(){
var str = '[ /\x2A a \x2A/ "f" /\x2A b \x2A/ ] /\x2A c \x2A/ ( /\x2A d \x2A/ ) /\x2A e \x2A/ { /\x2A f \x2A/ }'; return eval('({ /\x2A before \x2A/' + str + '/\x2A after \x2A/ }.f)') + '' === str;
}

JSON superset

§LINE SEPARATOR can appear in string literals
?
function(){
return eval("'\u2028'") === "\u2028";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return eval("'\u2028'") === "\u2028";
}
§PARAGRAPH SEPARATOR can appear in string literals
?
function(){
return eval("'\u2029'") === "\u2029";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return eval("'\u2029'") === "\u2029";
}

§Well-formed JSON.stringify
?
function(){
return JSON.stringify('\uDF06\uD834') === "\"\\udf06\\ud834\"" && JSON.stringify('\uDEAD') === "\"\\udead\"";
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
return JSON.stringify('\uDF06\uD834') === "\"\\udf06\\ud834\"" && JSON.stringify('\uDEAD') === "\"\\udead\"";
}

Node.js ES2020 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!100% complete100% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
100% complete100% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
100% complete100% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
100% complete100% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
100% complete100% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
100% complete100% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
100% complete100% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
100% complete100% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
100% complete100% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
100% complete100% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
100% complete100% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
100% complete100% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
100% complete100% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
100% complete100% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
100% complete100% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
100% complete100% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
100% complete100% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
94% complete94% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
94% complete94% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
94% complete94% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
94% complete94% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
94% complete94% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
89% complete63% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
89% complete63% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
63% complete63% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
63% complete63% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
63% complete63% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
63% complete63% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
63% complete57% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
57% complete57% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
57% complete57% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
57% complete42% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
47% complete42% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
47% complete42% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
42% complete42% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
42% complete42% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
0% complete0% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
0% complete0% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
0% complete0% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
0% complete0% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
0% complete0% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
0% complete0% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
0% complete0% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
0% complete0% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
0% complete0% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
0% complete0% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
0% complete0% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
0% complete0% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
0% complete0% complete

features

String.prototype.matchAll

§basic functionality
?
function(){
var iterator = '11a2bb'.matchAll(/(\d)(\D)/g); if(iterator[Symbol.iterator]() !== iterator)return false; var a = '', b = '', c = '', step; while(!(step = iterator.next()).done){ a += step.value[0]; b += step.value[1]; c += step.value[2]; } return a === '1a2b' && b === '12' && c === 'ab';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var iterator = '11a2bb'.matchAll(/(\d)(\D)/g); if(iterator[Symbol.iterator]() !== iterator)return false; var a = '', b = '', c = '', step; while(!(step = iterator.next()).done){ a += step.value[0]; b += step.value[1]; c += step.value[2]; } return a === '1a2b' && b === '12' && c === 'ab';
}
§throws on non-global regex
?
function(){
if (typeof String.prototype.matchAll !== 'function') return false; try { '11a2bb'.matchAll(/(\d)(\D)/); } catch (e) { return true; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
if (typeof String.prototype.matchAll !== 'function') return false; try { '11a2bb'.matchAll(/(\d)(\D)/); } catch (e) { return true; }
}

BigInt

§basic functionality
?
function(){
return (1n + 2n) === 3n;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (1n + 2n) === 3n;
}
§constructor
?
function(){
return BigInt("3") === 3n;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return BigInt("3") === 3n;
}
§BigInt.asUintN
?
function(){
return typeof BigInt.asUintN === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof BigInt.asUintN === 'function';
}
§BigInt.asIntN
?
function(){
return typeof BigInt.asIntN === 'function';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return typeof BigInt.asIntN === 'function';
}
§BigInt64Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new BigInt64Array(buffer); view[0] = 0x8000000000000000n; return view[0] === -0x8000000000000000n;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var buffer = new ArrayBuffer(64); var view = new BigInt64Array(buffer); view[0] = 0x8000000000000000n; return view[0] === -0x8000000000000000n;
}
§BigUint64Array
?
function(){
var buffer = new ArrayBuffer(64); var view = new BigUint64Array(buffer); view[0] = 0x10000000000000000n; return view[0] === 0n;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var buffer = new ArrayBuffer(64); var view = new BigUint64Array(buffer); view[0] = 0x10000000000000000n; return view[0] === 0n;
}
§DataView.prototype.getBigInt64
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setBigInt64(0, 1n); return view.getBigInt64(0) === 1n;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setBigInt64(0, 1n); return view.getBigInt64(0) === 1n;
}
§DataView.prototype.getBigUint64
?
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setBigUint64(0, 1n); return view.getBigUint64(0) === 1n;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var buffer = new ArrayBuffer(64); var view = new DataView(buffer); view.setBigUint64(0, 1n); return view.getBigUint64(0) === 1n;
}

§Promise.allSettled
?
function(){
Promise.allSettled([ Promise.resolve(1), Promise.reject(2), Promise.resolve(3) ]).then(it => { if ( it.length === 3 && it[0].status === 'fulfilled' && it[0].value === 1 && it[1].status === 'rejected' && it[1].reason === 2 && it[2].status === 'fulfilled' && it[2].value === 3 ) asyncTestPassed(); });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
Promise.allSettled([ Promise.resolve(1), Promise.reject(2), Promise.resolve(3) ]).then(it => { if ( it.length === 3 && it[0].status === 'fulfilled' && it[0].value === 1 && it[1].status === 'rejected' && it[1].reason === 2 && it[2].status === 'fulfilled' && it[2].value === 3 ) asyncTestPassed(); });
}
§nullish coalescing operator (??)
?
function(){
return (null ?? 42) === 42 && (undefined ?? 42) === 42 && (false ?? 42) === false && ('' ?? 42) === '' && (0 ?? 42) === 0 && isNaN(NaN ?? 42);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (null ?? 42) === 42 && (undefined ?? 42) === 42 && (false ?? 42) === false && ('' ?? 42) === '' && (0 ?? 42) === 0 && isNaN(NaN ?? 42);
}

globalThis

§"globalThis" global property is global object
?
function(){
var actualGlobal = Function('return this')(); actualGlobal.__system_global_test__ = 42; return typeof globalThis === 'object' && globalThis && globalThis === actualGlobal && !globalThis.lacksGlobalThis && globalThis.__system_global_test__ === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var actualGlobal = Function('return this')(); actualGlobal.__system_global_test__ = 42; return typeof globalThis === 'object' && globalThis && globalThis === actualGlobal && !globalThis.lacksGlobalThis && globalThis.__system_global_test__ === 42;
}
§"globalThis" global property has correct property descriptor
?
function(){
var actualGlobal = Function('return this')(); if (typeof globalThis !== 'object') { return false; } if (!('globalThis' in actualGlobal)) { return false; } if (Object.prototype.propertyIsEnumerable.call(actualGlobal, 'globalThis')) { return false; } var descriptor = Object.getOwnPropertyDescriptor(actualGlobal, 'globalThis'); return descriptor.value === actualGlobal && !descriptor.enumerable && descriptor.configurable && descriptor.writable;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var actualGlobal = Function('return this')(); if (typeof globalThis !== 'object') { return false; } if (!('globalThis' in actualGlobal)) { return false; } if (Object.prototype.propertyIsEnumerable.call(actualGlobal, 'globalThis')) { return false; } var descriptor = Object.getOwnPropertyDescriptor(actualGlobal, 'globalThis'); return descriptor.value === actualGlobal && !descriptor.enumerable && descriptor.configurable && descriptor.writable;
}

optional chaining operator (?.)

§optional property access
?
function(){
var foo = { baz: 42 }; var bar = null; return foo?.baz === 42 && bar?.baz === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var foo = { baz: 42 }; var bar = null; return foo?.baz === 42 && bar?.baz === void undefined;
}
§optional bracket access
?
function(){
var foo = { baz: 42 }; var bar = null; return foo?.['baz'] === 42 && bar?.['baz'] === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var foo = { baz: 42 }; var bar = null; return foo?.['baz'] === 42 && bar?.['baz'] === void undefined;
}
§optional method call
?
function(){
var foo = { baz: function () { return this.value; }, value: 42 }; var bar = null; return foo?.baz() === 42 && bar?.baz() === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var foo = { baz: function () { return this.value; }, value: 42 }; var bar = null; return foo?.baz() === 42 && bar?.baz() === void undefined;
}
§optional function call
?
function(){
var foo = { baz: function () { return 42; } }; var bar = {}; function baz() { return 42; }; var n; return foo.baz?.() === 42 && bar.baz?.() === void undefined && baz?.() === 42 && n?.() === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var foo = { baz: function () { return 42; } }; var bar = {}; function baz() { return 42; }; var n; return foo.baz?.() === 42 && bar.baz?.() === void undefined && baz?.() === 42 && n?.() === void undefined;
}
§spread parameters after optional chaining
?
function(){
var fn = null; var n = null; var o = {}; return fn?.(...[], 1) === void undefined && fn?.(...[], ...[]) === void undefined && o.method?.(...[], 1) === void undefined && n?.method(...[], 1) === void undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var fn = null; var n = null; var o = {}; return fn?.(...[], 1) === void undefined && fn?.(...[], ...[]) === void undefined && o.method?.(...[], 1) === void undefined && n?.method(...[], 1) === void undefined;
}

Node.js ES2021 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!100% complete100% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
100% complete100% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
100% complete100% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
100% complete100% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
100% complete100% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
100% complete100% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
100% complete100% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
100% complete100% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
100% complete100% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
100% complete100% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
100% complete100% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
100% complete100% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
100% complete100% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
100% complete100% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
100% complete100% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
100% complete100% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
100% complete100% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
100% complete100% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
100% complete100% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
100% complete20% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
100% complete20% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
6% complete6% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
6% complete6% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
6% complete6% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
6% complete6% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
6% complete6% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
6% complete6% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
6% complete6% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
6% complete6% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
6% complete0% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
6% complete0% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
6% complete0% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
6% complete0% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
6% complete0% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
6% complete0% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
6% complete0% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
0% complete0% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
0% complete0% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
0% complete0% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
0% complete0% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
0% complete0% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
0% complete0% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
0% complete0% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
0% complete0% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
0% complete0% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
0% complete0% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
0% complete0% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
0% complete0% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
0% complete0% complete

features

§String.prototype.replaceAll
?
function(){
return 'q=query+string+parameters'.replaceAll('+', ' ') === 'q=query string parameters';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return 'q=query+string+parameters'.replaceAll('+', ' ') === 'q=query string parameters';
}
§numeric separators
?
function(){
return 1_000_000.000_001 === 1000000.000001 && 0b1010_0001_1000_0101 === 0b1010000110000101;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return 1_000_000.000_001 === 1000000.000001 && 0b1010_0001_1000_0101 === 0b1010000110000101;
}

Promise.any

§fulfillment
?
function(){
Promise.any([ Promise.reject(1), Promise.resolve(2), Promise.resolve(3) ]).then(it => { if (it === 2) asyncTestPassed(); });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
Promise.any([ Promise.reject(1), Promise.resolve(2), Promise.resolve(3) ]).then(it => { if (it === 2) asyncTestPassed(); });
}
§AggregateError
?
function(){
Promise.any([ Promise.reject(1), Promise.reject(2), Promise.reject(3) ]).catch(error => { if (error instanceof AggregateError && error.errors.length === 3) asyncTestPassed(); });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
Promise.any([ Promise.reject(1), Promise.reject(2), Promise.reject(3) ]).catch(error => { if (error instanceof AggregateError && error.errors.length === 3) asyncTestPassed(); });
}

WeakReferences

§WeakRef minimal support
?
function(){
var O = {}; var weakref = new WeakRef(O); return weakref.deref() === O;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var O = {}; var weakref = new WeakRef(O); return weakref.deref() === O;
}
§FinalizationRegistry minimal support
?
function(){
var fr = new FinalizationRegistry(function() {}); return Object.getPrototypeOf(fr) === FinalizationRegistry.prototype;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var fr = new FinalizationRegistry(function() {}); return Object.getPrototypeOf(fr) === FinalizationRegistry.prototype;
}

Logical Assignment

§||= basic support
?
function(){
let a; let b = 0; let c = 1; a ||= 2; b ||= 2; c ||= 2; return a === 2 && b === 2 && c === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let a; let b = 0; let c = 1; a ||= 2; b ||= 2; c ||= 2; return a === 2 && b === 2 && c === 1;
}
§||= short-circuiting behaviour
?
function(){
let a = 1; let i = 1; a ||= ++i; return a === 1 && i === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let a = 1; let i = 1; a ||= ++i; return a === 1 && i === 1;
}
§||= setter not unecessarily invoked
?
function(){
let i = 1; var obj = { get x() { return 1 }, set x(n) { i++; } }; obj.x ||= 2; return i === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let i = 1; var obj = { get x() { return 1 }, set x(n) { i++; } }; obj.x ||= 2; return i === 1;
}
§&&= basic support
?
function(){
let a; let b = 0; let c = 1; a &&= 2; b &&= 2; c &&= 2; return typeof a === 'undefined' && b === 0 && c === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let a; let b = 0; let c = 1; a &&= 2; b &&= 2; c &&= 2; return typeof a === 'undefined' && b === 0 && c === 2;
}
§&&= short-circuiting behaviour
?
function(){
let a; let i = 1; a &&= ++i; return typeof a === 'undefined' && i === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let a; let i = 1; a &&= ++i; return typeof a === 'undefined' && i === 1;
}
§&&= setter not unecessarily invoked
?
function(){
let i = 1; var obj = { get x() { return }, set x(n) { i++; } }; obj.x &&= 2; return i === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let i = 1; var obj = { get x() { return }, set x(n) { i++; } }; obj.x &&= 2; return i === 1;
}
§??= basic support
?
function(){
let a; let b = 0; let c = 1; a ??= 2; b ??= 2; c ??= 2; return a === 2 && b === 0 && c === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let a; let b = 0; let c = 1; a ??= 2; b ??= 2; c ??= 2; return a === 2 && b === 0 && c === 1;
}
§??= short-circuiting behaviour
?
function(){
let a = 1; let i = 1; a ??= ++i; return a === 1 && i === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let a = 1; let i = 1; a ??= ++i; return a === 1 && i === 1;
}
§??= setter not unecessarily invoked
?
function(){
let i = 1; var obj = { get x() { return 1 }, set x(n) { i++; } }; obj.x ??= 2; return i === 1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let i = 1; var obj = { get x() { return 1 }, set x(n) { i++; } }; obj.x ??= 2; return i === 1;
}

Node.js ES2022 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!97% complete97% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
97% complete97% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
97% complete97% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
97% complete97% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
97% complete97% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
97% complete97% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
97% complete97% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
97% complete97% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
97% complete97% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
97% complete97% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
97% complete97% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
97% complete97% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
97% complete97% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
76% complete74% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
92% complete69% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
71% complete61% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
71% complete58% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
71% complete58% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
56% complete56% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
56% complete53% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
56% complete53% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
51% complete41% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
53% complete38% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
53% complete38% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
38% complete38% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
38% complete38% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
38% complete38% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
38% complete38% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
38% complete38% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
38% complete38% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
38% complete38% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
28% complete17% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
28% complete17% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
28% complete17% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
28% complete17% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
28% complete17% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
28% complete17% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
17% complete17% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
17% complete17% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
17% complete17% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
17% complete17% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
17% complete17% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
17% complete17% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
17% complete17% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
17% complete17% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
17% complete17% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
17% complete17% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
17% complete17% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
17% complete17% complete

features

instance class fields

§public instance class fields
?
function(){
class C { x = 'x'; } return new C().x === 'x';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { x = 'x'; } return new C().x === 'x';
}
§private instance class fields basic support
?
function(){
class C { #x; constructor(x){ this.#x = x; } x(){ return this.#x; } } return new C(42).x() === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { #x; constructor(x){ this.#x = x; } x(){ return this.#x; } } return new C(42).x() === 42;
}
§private instance class fields initializers
?
function(){
class C { #x = 42; x(){ return this.#x; } } return new C().x() === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { #x = 42; x(){ return this.#x; } } return new C().x() === 42;
}
§optional private instance class fields access
?
function(){
class C { #x = 42; x(o = this){ return o?.#x; } } return new C().x() === 42 && new C().x(null) === void 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { #x = 42; x(o = this){ return o?.#x; } } return new C().x() === 42 && new C().x(null) === void 0;
}
§optional deep private instance class fields access
?
function(){
class C { #x = 42; x(o = {p: this}){ return o?.p.#x; } } return new C().x() === 42 && new C().x(null) === void 0;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { #x = 42; x(o = {p: this}){ return o?.p.#x; } } return new C().x() === 42 && new C().x(null) === void 0;
}
§computed instance class fields
?
function(){
class C { ['x'] = 42; } return new C().x === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { ['x'] = 42; } return new C().x === 42;
}

static class fields

§public static class fields
?
function(){
class C { static x = 'x'; } return C.x === 'x';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { static x = 'x'; } return C.x === 'x';
}
§static class fields use [[Define]]
?
function(){
return (class X { static name = "name"; }).name === 'name';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (class X { static name = "name"; }).name === 'name';
}
§private static class fields
?
function(){
class C { static #x = 42; x(){ return C.#x; } } return new C().x() === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { static #x = 42; x(){ return C.#x; } } return new C().x() === 42;
}
§computed static class fields
?
function(){
class C { static ['x'] = 42; } return C.x === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { static ['x'] = 42; } return C.x === 42;
}

private class methods

§private instance methods
?
function(){
class C { #x() { return 42; } x() { return this.#x(); } } return new C().x() === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { #x() { return 42; } x() { return this.#x(); } } return new C().x() === 42;
}
§private static methods
?
function(){
class C { static #x() { return 42; } x() { return C.#x(); } } return new C().x() === 42;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class C { static #x() { return 42; } x() { return C.#x(); } } return new C().x() === 42;
}
§private accessor properties
?
function(){
var y = false; class C { get #x() { return 42; } set #x(x) { y = x; } x() { this.#x = true; return this.#x; } } return new C().x() === 42 && y;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var y = false; class C { get #x() { return 42; } set #x(x) { y = x; } x() { this.#x = true; return this.#x; } } return new C().x() === 42 && y;
}
§private static accessor properties
?
function(){
var y = false; class C { static get #x() { return 42; } static set #x(x) { y = x; } x() { C.#x = true; return C.#x; } } return new C().x() === 42 && y;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var y = false; class C { static get #x() { return 42; } static set #x(x) { y = x; } x() { C.#x = true; return C.#x; } } return new C().x() === 42 && y;
}

§Ergonomic brand checks for private fields
?
function(){
class A { #x; static check(obj) { return #x in obj; } } return A.check(new A) && !A.check({});
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class A { #x; static check(obj) { return #x in obj; } } return A.check(new A) && !A.check({});
}
§Class static initialization blocks
?
function(){
let ok = false; class A { static { ok = true; } } return ok;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let ok = false; class A { static { ok = true; } } return ok;
}

.at() method on the built-in indexables

§Array.prototype.at()
?
function(){
var arr = [1, 2, 3]; return arr.at(0) === 1 && arr.at(-3) === 1 && arr.at(1) === 2 && arr.at(-2) === 2 && arr.at(2) === 3 && arr.at(-1) === 3 && arr.at(3) === undefined && arr.at(-4) === undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var arr = [1, 2, 3]; return arr.at(0) === 1 && arr.at(-3) === 1 && arr.at(1) === 2 && arr.at(-2) === 2 && arr.at(2) === 3 && arr.at(-1) === 3 && arr.at(3) === undefined && arr.at(-4) === undefined;
}
§String.prototype.at()
?
function(){
var str = 'abc'; return str.at(0) === 'a' && str.at(-3) === 'a' && str.at(1) === 'b' && str.at(-2) === 'b' && str.at(2) === 'c' && str.at(-1) === 'c' && str.at(3) === undefined && str.at(-4) === undefined;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var str = 'abc'; return str.at(0) === 'a' && str.at(-3) === 'a' && str.at(1) === 'b' && str.at(-2) === 'b' && str.at(2) === 'c' && str.at(-1) === 'c' && str.at(3) === undefined && str.at(-4) === undefined;
}
§%TypedArray%.prototype.at()
?
function(){
return [ 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array' ].every(function (TypedArray) { var Constructor = globalThis[TypedArray]; if (typeof Constructor !== 'function') { return false; } var arr = new Constructor([1, 2, 3]); return arr.at(0) === 1 && arr.at(-3) === 1 && arr.at(1) === 2 && arr.at(-2) === 2 && arr.at(2) === 3 && arr.at(-1) === 3 && arr.at(3) === undefined && arr.at(-4) === undefined; });
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return [ 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array' ].every(function (TypedArray) { var Constructor = globalThis[TypedArray]; if (typeof Constructor !== 'function') { return false; } var arr = new Constructor([1, 2, 3]); return arr.at(0) === 1 && arr.at(-3) === 1 && arr.at(1) === 2 && arr.at(-2) === 2 && arr.at(2) === 3 && arr.at(-1) === 3 && arr.at(3) === undefined && arr.at(-4) === undefined; });
}

Object.hasOwn

§Basic functionality
?
function(){
return Object.hasOwn({ x: 2 }, "x") === true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Object.hasOwn({ x: 2 }, "x") === true;
}
§ToObject called before ToPropertyKey
?
function(){
var ok = !!Object.hasOwn; try { Object.hasOwn(null, { toString: function () { ok = false } }); return false; } catch (e) { return ok; }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var ok = !!Object.hasOwn; try { Object.hasOwn(null, { toString: function () { ok = false } }); return false; } catch (e) { return ok; }
}

Error.cause property

§Error has cause
?
function(){
var error = new Error('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var error = new Error('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
§Error.prototype lacks cause
?
function(){
return !('cause' in Error.prototype);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return !('cause' in Error.prototype);
}
§EvalError has cause
?
function(){
var error = new EvalError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var error = new EvalError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
§EvalError.prototype lacks cause
?
function(){
return !('cause' in EvalError.prototype);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return !('cause' in EvalError.prototype);
}
§RangeError has cause
?
function(){
var error = new RangeError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var error = new RangeError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
§RangeError.prototype lacks cause
?
function(){
return !('cause' in RangeError.prototype);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return !('cause' in RangeError.prototype);
}
§ReferenceError has cause
?
function(){
var error = new ReferenceError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var error = new ReferenceError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
§ReferenceError.prototype lacks cause
?
function(){
return !('cause' in ReferenceError.prototype);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return !('cause' in ReferenceError.prototype);
}
§SyntaxError has cause
?
function(){
var error = new SyntaxError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var error = new SyntaxError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
§SyntaxError.prototype lacks cause
?
function(){
return !('cause' in SyntaxError.prototype);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return !('cause' in SyntaxError.prototype);
}
§TypeError has cause
?
function(){
var error = new TypeError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var error = new TypeError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
§TypeError.prototype lacks cause
?
function(){
return !('cause' in TypeError.prototype);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return !('cause' in TypeError.prototype);
}
§URIError has cause
?
function(){
var error = new URIError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
var error = new URIError('error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
§URIError.prototype lacks cause
?
function(){
return !('cause' in URIError.prototype);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
return !('cause' in URIError.prototype);
}
§AggregateError has cause
?
function(){
var error = new AggregateError([], 'error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
Flag
No
No
No
No
No
No
No
No
Error
No
Error
No
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var error = new AggregateError([], 'error', { cause: 'cause' }) return error.hasOwnProperty('cause') && error.cause === 'cause';
}
§AggregateError.prototype lacks cause
?
function(){
return !('cause' in AggregateError.prototype);
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return !('cause' in AggregateError.prototype);
}

RegExp Match Indices (`hasIndices` / `d` flag)

§constructor supports it
?
function(){
return new RegExp('a', 'd') instanceof RegExp;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new RegExp('a', 'd') instanceof RegExp;
}
§shows up in flags
?
function(){
var expected = ['hasIndices']; // Sorted alphabetically by shortname – "dgimsuy". if ('global' in RegExp.prototype) expected.push('global'); if ('ignoreCase' in RegExp.prototype) expected.push('ignoreCase'); if ('multiline' in RegExp.prototype) expected.push('multiline'); if ('dotAll' in RegExp.prototype) expected.push('dotAll'); if ('unicode' in RegExp.prototype) expected.push('unicode'); if ('sticky' in RegExp.prototype) expected.push('sticky'); var actual = []; var p = new Proxy({}, { get: function(o, k) { actual.push(k); return o[k]; }}); Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(p); if (expected.length !== actual.length) return false; for (var i = 0; i < expected.length; i++) { if (expected[i] !== actual[i]) return false; } return true;
}
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var expected = ['hasIndices']; // Sorted alphabetically by shortname – "dgimsuy". if ('global' in RegExp.prototype) expected.push('global'); if ('ignoreCase' in RegExp.prototype) expected.push('ignoreCase'); if ('multiline' in RegExp.prototype) expected.push('multiline'); if ('dotAll' in RegExp.prototype) expected.push('dotAll'); if ('unicode' in RegExp.prototype) expected.push('unicode'); if ('sticky' in RegExp.prototype) expected.push('sticky'); var actual = []; var p = new Proxy({}, { get: function(o, k) { actual.push(k); return o[k]; }}); Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(p); if (expected.length !== actual.length) return false; for (var i = 0; i < expected.length; i++) { if (expected[i] !== actual[i]) return false; } return true;
}

Node.js ES2023 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!100% complete100% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
100% complete100% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
100% complete100% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
100% complete100% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
100% complete100% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
100% complete100% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
100% complete100% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
100% complete100% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
100% complete100% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
33% complete33% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
33% complete33% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
33% complete33% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
33% complete33% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
33% complete33% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
33% complete33% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
33% complete33% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
33% complete33% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
33% complete33% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
33% complete33% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
33% complete33% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
33% complete33% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
33% complete33% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
33% complete33% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
33% complete33% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
33% complete33% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
33% complete33% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
33% complete33% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
33% complete33% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
33% complete33% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
0% complete0% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
0% complete0% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
0% complete0% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
0% complete0% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
0% complete0% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
0% complete0% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
0% complete0% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
0% complete0% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
0% complete0% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
0% complete0% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
0% complete0% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
0% complete0% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
0% complete0% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
0% complete0% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
0% complete0% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
0% complete0% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
0% complete0% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
0% complete0% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
0% complete0% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
0% complete0% complete

features

Array find from last

§Array.prototype.findLast
?
function(){
var arr = [{ x: 1 }, { x: 2 }, { x: 1 }, { x: 2 }]; return arr.findLast(function (o) { return o.x === 1; }) === arr[2];
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var arr = [{ x: 1 }, { x: 2 }, { x: 1 }, { x: 2 }]; return arr.findLast(function (o) { return o.x === 1; }) === arr[2];
}
§Array.prototype.findLastIndex
?
function(){
var arr = [{ x: 1 }, { x: 2 }, { x: 1 }, { x: 2 }]; return arr.findLastIndex(function (o) { return o.x === 1; }) === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var arr = [{ x: 1 }, { x: 2 }, { x: 1 }, { x: 2 }]; return arr.findLastIndex(function (o) { return o.x === 1; }) === 2;
}

§Hashbang Grammar
?
function(){
try { return !eval('#!/wash/your/hands'); } catch (e) { return false }
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
try { return !eval('#!/wash/your/hands'); } catch (e) { return false }
}

Node.js ES2024 Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!100% complete100% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
100% complete100% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
80% complete80% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
80% complete80% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
0% complete0% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
0% complete0% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
0% complete0% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
0% complete0% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
0% complete0% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
0% complete0% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
0% complete0% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
0% complete0% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
0% complete0% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
0% complete0% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
0% complete0% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
0% complete0% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
0% complete0% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
0% complete0% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
0% complete0% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
0% complete0% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
0% complete0% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
0% complete0% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
0% complete0% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
0% complete0% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
0% complete0% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
0% complete0% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
0% complete0% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
0% complete0% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
0% complete0% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
0% complete0% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
0% complete0% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
0% complete0% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
0% complete0% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
0% complete0% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
0% complete0% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
0% complete0% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
0% complete0% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
0% complete0% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
0% complete0% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
0% complete0% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
0% complete0% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
0% complete0% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
0% complete0% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
0% complete0% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
0% complete0% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
0% complete0% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
0% complete0% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
0% complete0% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
0% complete0% complete

features

RegExp `v` flag

§set notations
?
function(){
return /[\p{ASCII}&&\p{Decimal_Number}]/v.test("0") && /[\p{Any}--[\x01-\u{10ffff}]]/v.test("\0")
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /[\p{ASCII}&&\p{Decimal_Number}]/v.test("0") && /[\p{Any}--[\x01-\u{10ffff}]]/v.test("\0")
}
§properties of Strings
?
function(){
return /^\p{Emoji_Keycap_Sequence}$/v.test("*\uFE0F\u20E3") && !/^\p{Emoji_Keycap_Sequence}$/v.test("*");
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /^\p{Emoji_Keycap_Sequence}$/v.test("*\uFE0F\u20E3") && !/^\p{Emoji_Keycap_Sequence}$/v.test("*");
}
§constructor supports it
?
function(){
return new RegExp('a', 'v') instanceof RegExp;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new RegExp('a', 'v') instanceof RegExp;
}
§shows up in flags
?
function(){
var flags = []; var p = new Proxy({}, { get: function(o, k) { flags.push(k); return o[k]; }}); Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(p); return flags.indexOf("unicodeSets") !== -1;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var flags = []; var p = new Proxy({}, { get: function(o, k) { flags.push(k); return o[k]; }}); Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(p); return flags.indexOf("unicodeSets") !== -1;
}
§Unicode 15.1
?
function(){
return /^\p{RGI_Emoji}$/v.test("🐦‍🔥");
}
Yes
Yes
Yes
Yes
No
No
No
No
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return /^\p{RGI_Emoji}$/v.test("🐦‍🔥");
}

Node.js ESNEXT Support

22.0.0
(these versions have identical results)
nightly v8 11.9.169.7-node.13
Nightly!41% complete5% complete
21.7.1
(these versions have identical results)
21.7.1 v8 11.8.172.17-node.20
21.7.0 v8 11.8.172.17-node.20
21.6.2 v8 11.8.172.17-node.19
21.6.1 v8 11.8.172.17-node.19
21.6.0 v8 11.8.172.17-node.19
21.5.0 v8 11.8.172.17-node.18
21.4.0 v8 11.8.172.17-node.17
21.3.0 v8 11.8.172.17-node.17
41% complete5% complete
21.2.0
(these versions have identical results)
21.2.0 v8 11.8.172.17-node.15
21.1.0 v8 11.8.172.15-node.14
21.0.0 v8 11.8.172.13-node.12
41% complete5% complete
20.11.1
(these versions have identical results)
20.11.1 v8 11.3.244.8-node.17
20.11.0 v8 11.3.244.8-node.17
20.10.0 v8 11.3.244.8-node.25
20.9.0 v8 11.3.244.8-node.16
20.8.1 v8 11.3.244.8-node.16
20.8.0 v8 11.3.244.8-node.16
20.7.0 v8 11.3.244.8-node.15
20.6.1 v8 11.3.244.8-node.14
20.6.0 v8 11.3.244.8-node.14
20.5.1 v8 11.3.244.8-node.10
20.5.0 v8 11.3.244.8-node.10
20.4.0 v8 11.3.244.8-node.10
20.3.1 v8 11.3.244.8-node.9
20.3.0 v8 11.3.244.8-node.9
20.2.0 v8 11.3.244.8-node.9
20.1.0 v8 11.3.244.8-node.6
20.0.0 v8 11.3.244.4-node.3
5% complete3% complete
19.9.0
(these versions have identical results)
19.9.0 v8 10.8.168.25-node.16
19.8.1 v8 10.8.168.25-node.12
19.8.0 v8 10.8.168.25-node.12
19.7.0 v8 10.8.168.25-node.11
19.6.1 v8 10.8.168.25-node.11
19.6.0 v8 10.8.168.25-node.11
19.5.0 v8 10.8.168.25-node.11
19.4.0 v8 10.8.168.25-node.11
19.3.0 v8 10.8.168.21-node.8
19.2.0 v8 10.8.168.20-node.8
5% complete3% complete
19.1.0
(these versions have identical results)
19.1.0 v8 10.7.193.20-node.19
5% complete3% complete
19.0.1
(these versions have identical results)
19.0.1 v8 10.7.193.13-node.16
19.0.0 v8 10.7.193.13-node.16
5% complete3% complete
18.19.1
(these versions have identical results)
18.19.1 v8 10.2.154.26-node.28
18.19.0 v8 10.2.154.26-node.28
18.18.2 v8 10.2.154.26-node.26
18.18.1 v8 10.2.154.26-node.26
18.18.0 v8 10.2.154.26-node.26
18.17.1 v8 10.2.154.26-node.26
18.17.0 v8 10.2.154.26-node.26
18.16.1 v8 10.2.154.26-node.26
18.16.0 v8 10.2.154.26-node.26
18.15.0 v8 10.2.154.26-node.25
18.14.2 v8 10.2.154.26-node.22
18.14.1 v8 10.2.154.23-node.22
18.14.0 v8 10.2.154.23-node.22
18.13.0 v8 10.2.154.23-node.21
3% complete3% complete
18.12.1
(these versions have identical results)
18.12.1 v8 10.2.154.15-node.12
18.12.0 v8 10.2.154.15-node.12
18.11.0 v8 10.2.154.15-node.12
18.10.0 v8 10.2.154.15-node.12
18.9.1 v8 10.2.154.15-node.12
18.9.0 v8 10.2.154.15-node.12
18.8.0 v8 10.2.154.13-node.11
18.7.0 v8 10.2.154.13-node.9
18.6.0 v8 10.2.154.13-node.8
18.5.0 v8 10.2.154.4-node.8
18.4.0 v8 10.2.154.4-node.8
18.3.0 v8 10.2.154.4-node.8
18.2.0 v8 10.1.124.8-node.13
18.1.0 v8 10.1.124.8-node.13
18.0.0 v8 10.1.124.8-node.13
3% complete3% complete
17.9.1
(these versions have identical results)
17.9.1 v8 9.6.180.15-node.16
17.9.0 v8 9.6.180.15-node.16
17.8.0 v8 9.6.180.15-node.16
17.7.2 v8 9.6.180.15-node.15
17.7.1 v8 9.6.180.15-node.15
17.7.0 v8 9.6.180.15-node.15
17.6.0 v8 9.6.180.15-node.13
17.5.0 v8 9.6.180.15-node.13
17.4.0 v8 9.6.180.15-node.13
17.3.1 v8 9.6.180.15-node.12
17.3.0 v8 9.6.180.15-node.12
17.2.0 v8 9.6.180.14-node.12
3% complete3% complete
17.1.0
(these versions have identical results)
17.1.0 v8 9.5.172.25-node.13
17.0.1 v8 9.5.172.21-node.12
17.0.0 v8 9.5.172.21-node.12
3% complete3% complete
16.20.2
(these versions have identical results)
16.20.2 v8 9.4.146.26-node.26
16.20.1 v8 9.4.146.26-node.26
16.20.0 v8 9.4.146.26-node.26
16.19.1 v8 9.4.146.26-node.24
16.19.0 v8 9.4.146.26-node.24
16.18.1 v8 9.4.146.26-node.22
16.18.0 v8 9.4.146.26-node.22
16.17.1 v8 9.4.146.26-node.22
16.17.0 v8 9.4.146.26-node.22
16.16.0 v8 9.4.146.24-node.21
16.15.1 v8 9.4.146.24-node.21
16.15.0 v8 9.4.146.24-node.20
16.14.2 v8 9.4.146.24-node.20
16.14.1 v8 9.4.146.24-node.20
16.14.0 v8 9.4.146.24-node.20
3% complete3% complete
16.13.2
(these versions have identical results)
16.13.2 v8 9.4.146.24-node.14
16.13.1 v8 9.4.146.24-node.14
16.13.0 v8 9.4.146.19-node.13
16.12.0 v8 9.4.146.19-node.13
16.11.1 v8 9.4.146.19-node.13
16.11.0 v8 9.4.146.19-node.13
3% complete3% complete
16.10.0
(these versions have identical results)
16.10.0 v8 9.3.345.19-node.14
16.9.1 v8 9.3.345.16-node.12
16.9.0 v8 9.3.345.16-node.11
3% complete3% complete
16.8.0
(these versions have identical results)
16.8.0 v8 9.2.230.21-node.20
16.7.0 v8 9.2.230.21-node.19
16.6.2 v8 9.2.230.21-node.19
16.6.1 v8 9.2.230.21-node.19
16.6.0 v8 9.2.230.21-node.18
3% complete3% complete
16.5.0
(these versions have identical results)
16.5.0 v8 9.1.269.38-node.20
16.4.2 v8 9.1.269.36-node.14
16.4.1 v8 9.1.269.36-node.14
16.4.0 v8 9.1.269.36-node.14
3% complete3% complete
16.3.0
(these versions have identical results)
16.3.0 v8 9.0.257.25-node.16
16.2.0 v8 9.0.257.25-node.16
16.1.0 v8 9.0.257.24-node.11
3% complete3% complete
16.0.0
(these versions have identical results)
16.0.0 v8 9.0.257.17-node.10
3% complete3% complete
15.14.0
(these versions have identical results)
15.14.0 v8 8.6.395.17-node.28
15.13.0 v8 8.6.395.17-node.28
15.12.0 v8 8.6.395.17-node.27
15.11.0 v8 8.6.395.17-node.27
15.10.0 v8 8.6.395.17-node.25
15.9.0 v8 8.6.395.17-node.25
15.8.0 v8 8.6.395.17-node.23
15.7.0 v8 8.6.395.17-node.23
15.6.0 v8 8.6.395.17-node.23
15.5.1 v8 8.6.395.17-node.23
15.5.0 v8 8.6.395.17-node.23
15.4.0 v8 8.6.395.17-node.22
15.3.0 v8 8.6.395.17-node.22
15.2.1 v8 8.6.395.17-node.17
15.2.0 v8 8.6.395.17-node.17
15.1.0 v8 8.6.395.17-node.16
15.0.1 v8 8.6.395.17-node.15
15.0.0 v8 8.6.395.16-node.15
3% complete3% complete
14.21.3
(these versions have identical results)
14.21.3 v8 8.4.371.23-node.88
14.21.2 v8 8.4.371.23-node.88
14.21.1 v8 8.4.371.23-node.87
14.21.0 v8 8.4.371.23-node.87
14.20.1 v8 8.4.371.23-node.87
14.20.0 v8 8.4.371.23-node.87
14.19.3 v8 8.4.371.23-node.87
14.19.2 v8 8.4.371.23-node.87
14.19.1 v8 8.4.371.23-node.85
14.19.0 v8 8.4.371.23-node.85
3% complete3% complete
14.18.3
(these versions have identical results)
14.18.3 v8 8.4.371.23-node.85
14.18.2 v8 8.4.371.23-node.85
14.18.1 v8 8.4.371.23-node.84
14.18.0 v8 8.4.371.23-node.84
14.17.6 v8 8.4.371.23-node.76
14.17.5 v8 8.4.371.23-node.76
14.17.4 v8 8.4.371.23-node.76
14.17.3 v8 8.4.371.23-node.67
14.17.2 v8 8.4.371.23-node.67
14.17.1 v8 8.4.371.23-node.67
14.17.0 v8 8.4.371.23-node.63
14.16.1 v8 8.4.371.19-node.18
14.16.0 v8 8.4.371.19-node.18
14.15.5 v8 8.4.371.19-node.18
14.15.4 v8 8.4.371.19-node.17
14.15.3 v8 8.4.371.19-node.17
14.15.2 v8 8.4.371.19-node.17
14.15.1 v8 8.4.371.19-node.17
14.15.0 v8 8.4.371.19-node.17
14.14.0 v8 8.4.371.19-node.17
14.13.1 v8 8.4.371.19-node.16
14.13.0 v8 8.4.371.19-node.16
14.12.0 v8 8.4.371.19-node.16
14.11.0 v8 8.4.371.19-node.16
14.10.1 v8 8.4.371.19-node.16
14.10.0 v8 8.4.371.19-node.16
14.9.0 v8 8.4.371.19-node.13
14.8.0 v8 8.4.371.19-node.12
14.7.0 v8 8.4.371.19-node.12
14.6.0 v8 8.4.371.19-node.12
3% complete3% complete
14.5.0
(these versions have identical results)
14.5.0 v8 8.3.110.9-node.23
14.4.0 v8 8.1.307.31-node.33
14.3.0 v8 8.1.307.31-node.33
14.2.0 v8 8.1.307.31-node.33
14.1.0 v8 8.1.307.31-node.32
14.0.0 v8 8.1.307.30-node.30
3% complete3% complete
13.14.0
(these versions have identical results)
13.14.0 v8 7.9.317.25-node.32
13.13.0 v8 7.9.317.25-node.30
13.12.0 v8 7.9.317.25-node.30
3% complete3% complete
13.11.0
(these versions have identical results)
13.11.0 v8 7.9.317.25-node.29
13.10.1 v8 7.9.317.25-node.29
13.10.0 v8 7.9.317.25-node.29
13.9.0 v8 7.9.317.25-node.28
13.8.0 v8 7.9.317.25-node.28
13.7.0 v8 7.9.317.25-node.28
13.6.0 v8 7.9.317.25-node.26
13.5.0 v8 7.9.317.25-node.23
13.4.0 v8 7.9.317.25-node.23
13.3.0 v8 7.9.317.25-node.23
13.2.0 v8 7.9.317.23-node.20
3% complete3% complete
13.1.0
(these versions have identical results)
13.1.0 v8 7.8.279.17-node.19
13.0.1 v8 7.8.279.17-node.14
13.0.0 v8 7.8.279.17-node.14
3% complete3% complete
12.22.12
(these versions have identical results)
12.22.12 v8 7.8.279.23-node.57
12.22.11 v8 7.8.279.23-node.56
12.22.10 v8 7.8.279.23-node.56
12.22.9 v8 7.8.279.23-node.56
12.22.8 v8 7.8.279.23-node.56
12.22.7 v8 7.8.279.23-node.56
12.22.6 v8 7.8.279.23-node.56
12.22.5 v8 7.8.279.23-node.56
12.22.4 v8 7.8.279.23-node.56
12.22.3 v8 7.8.279.23-node.46
12.22.2 v8 7.8.279.23-node.46
12.22.1 v8 7.8.279.23-node.46
12.22.0 v8 7.8.279.23-node.46
12.21.0 v8 7.8.279.23-node.45
12.20.2 v8 7.8.279.23-node.45
12.20.1 v8 7.8.279.23-node.45
12.20.0 v8 7.8.279.23-node.45
12.19.1 v8 7.8.279.23-node.44
12.19.0 v8 7.8.279.23-node.44
12.18.4 v8 7.8.279.23-node.39
12.18.3 v8 7.8.279.23-node.39
12.18.2 v8 7.8.279.23-node.39
12.18.1 v8 7.8.279.23-node.38
12.18.0 v8 7.8.279.23-node.37
12.17.0 v8 7.8.279.23-node.37
3% complete3% complete
12.16.3
(these versions have identical results)
12.16.3 v8 7.8.279.23-node.35
12.16.2 v8 7.8.279.23-node.34
12.16.1 v8 7.8.279.23-node.31
12.16.0 v8 7.8.279.23-node.31
12.15.0 v8 7.7.299.13-node.16
12.14.1 v8 7.7.299.13-node.16
12.14.0 v8 7.7.299.13-node.16
12.13.1 v8 7.7.299.13-node.16
12.13.0 v8 7.7.299.13-node.12
12.12.0 v8 7.7.299.13-node.12
12.11.1 v8 7.7.299.11-node.12
12.11.0 v8 7.7.299.11-node.12
3% complete3% complete
12.10.0
(these versions have identical results)
12.10.0 v8 7.6.303.29-node.16
12.9.1 v8 7.6.303.29-node.15
12.9.0 v8 7.6.303.29-node.15
3% complete3% complete
12.8.1
(these versions have identical results)
12.8.1 v8 7.5.288.22-node.16
12.8.0 v8 7.5.288.22-node.16
12.7.0 v8 7.5.288.22-node.16
12.6.0 v8 7.5.288.22-node.14
12.5.0 v8 7.5.288.22-node.14
3% complete3% complete
12.4.0
(these versions have identical results)
12.4.0 v8 7.4.288.27-node.18
12.3.1 v8 7.4.288.27-node.18
12.3.0 v8 7.4.288.27-node.17
12.2.0 v8 7.4.288.21-node.17
12.1.0 v8 7.4.288.21-node.16
3% complete3% complete
12.0.0
(these versions have identical results)
12.0.0 v8 7.4.288.21-node.16
3% complete3% complete
11.15.0
(these versions have identical results)
11.15.0 v8 7.0.276.38-node.19
11.14.0 v8 7.0.276.38-node.18
11.13.0 v8 7.0.276.38-node.18
11.12.0 v8 7.0.276.38-node.18
11.11.0 v8 7.0.276.38-node.18
11.10.1 v8 7.0.276.38-node.17
11.10.0 v8 7.0.276.38-node.17
11.9.0 v8 7.0.276.38-node.16
11.8.0 v8 7.0.276.38-node.16
11.7.0 v8 7.0.276.38-node.16
11.6.0 v8 7.0.276.38-node.13
11.5.0 v8 7.0.276.38-node.13
11.4.0 v8 7.0.276.38-node.13
11.3.0 v8 7.0.276.38-node.11
11.2.0 v8 7.0.276.38-node.11
11.1.0 v8 7.0.276.32-node.7
11.0.0 v8 7.0.276.28-node.5
3% complete3% complete
10.24.1
(these versions have identical results)
10.24.1 v8 6.8.275.32-node.59
10.24.0 v8 6.8.275.32-node.59
10.23.3 v8 6.8.275.32-node.59
10.23.2 v8 6.8.275.32-node.59
10.23.1 v8 6.8.275.32-node.59
10.23.0 v8 6.8.275.32-node.59
10.22.1 v8 6.8.275.32-node.58
10.22.0 v8 6.8.275.32-node.58
10.21.0 v8 6.8.275.32-node.56
10.20.1 v8 6.8.275.32-node.56
10.20.0 v8 6.8.275.32-node.56
10.19.0 v8 6.8.275.32-node.55
10.18.1 v8 6.8.275.32-node.55
10.18.0 v8 6.8.275.32-node.54
10.17.0 v8 6.8.275.32-node.54
10.16.3 v8 6.8.275.32-node.54
10.16.2 v8 6.8.275.32-node.54
10.16.1 v8 6.8.275.32-node.54
10.16.0 v8 6.8.275.32-node.52
3% complete3% complete
10.15.3
(these versions have identical results)
10.15.3 v8 6.8.275.32-node.51
10.15.2 v8 6.8.275.32-node.12
10.15.1 v8 6.8.275.32-node.12
10.15.0 v8 6.8.275.32-node.45
10.14.2 v8 6.8.275.32-node.45
10.14.1 v8 6.8.275.32-node.36
10.14.0 v8 6.8.275.32-node.36
10.13.0 v8 6.8.275.32-node.36
10.12.0 v8 6.8.275.32-node.35
10.11.0 v8 6.8.275.32-node.28
10.10.0 v8 6.8.275.30-node.24
10.9.0 v8 6.8.275.24-node.14
3% complete3% complete
10.8.0
(these versions have identical results)
10.8.0 v8 6.7.288.49-node.19
10.7.0 v8 6.7.288.49-node.15
10.6.0 v8 6.7.288.46-node.13
3% complete3% complete
10.5.0
(these versions have identical results)
10.5.0 v8 6.7.288.46-node.8
10.4.1 v8 6.7.288.45-node.7
10.4.0 v8 6.7.288.43-node.7
3% complete3% complete
10.3.0
(these versions have identical results)
10.3.0 v8 6.6.346.32-node.9
10.2.1 v8 6.6.346.32-node.8
10.2.0 v8 6.6.346.32-node.8
10.1.0 v8 6.6.346.27-node.6
10.0.0 v8 6.6.346.24-node.5
3% complete3% complete
9.11.2
(these versions have identical results)
9.11.2 v8 6.2.414.46-node.23
9.11.1 v8 6.2.414.46-node.23
9.11.0 v8 6.2.414.46-node.23
9.10.1 v8 6.2.414.46-node.23
9.10.0 v8 6.2.414.46-node.23
9.9.0 v8 6.2.414.46-node.22
9.8.0 v8 6.2.414.46-node.21
9.7.1 v8 6.2.414.46-node.20
9.7.0 v8 6.2.414.46-node.20
9.6.1 v8 6.2.414.46-node.20
9.6.0 v8 6.2.414.46-node.20
9.5.0 v8 6.2.414.46-node.18
9.4.0 v8 6.2.414.46-node.17
9.3.0 v8 6.2.414.46-node.15
9.2.1 v8 6.2.414.44-node.11
9.2.0 v8 6.2.414.44-node.11
9.1.0 v8 6.2.414.32-node.8
9.0.0 v8 6.2.414.32-node.8
8.17.0 v8 6.2.414.78
8.16.2 v8 6.2.414.78
8.16.1 v8 6.2.414.77
8.16.0 v8 6.2.414.77
8.15.1 v8 6.2.414.75
8.15.0 v8 6.2.414.75
8.14.1 v8 6.2.414.75
8.14.0 v8 6.2.414.72
8.13.0 v8 6.2.414.72
8.12.0 v8 6.2.414.66
8.11.4 v8 6.2.414.54
8.11.3 v8 6.2.414.54
8.11.2 v8 6.2.414.54
8.11.1 v8 6.2.414.50
8.11.0 v8 6.2.414.50
8.10.0 v8 6.2.414.50
3% complete3% complete
8.9.4
(these versions have identical results)
8.9.4 v8 6.1.534.50
8.9.3 v8 6.1.534.48
8.9.2 v8 6.1.534.48
8.9.1 v8 6.1.534.47
8.9.0 v8 6.1.534.46
8.8.1 v8 6.1.534.42
8.8.0 v8 6.1.534.42
8.7.0 v8 6.1.534.42
3% complete3% complete
8.6.0
(these versions have identical results)
8.6.0 v8 6.0.287.53
8.5.0 v8 6.0.287.53
8.4.0 v8 6.0.286.52
8.3.0 v8 6.0.286.52
3% complete3% complete
8.2.1
(these versions have identical results)
8.2.1 v8 5.8.283.41
8.2.0 v8 5.8.283.41
8.1.4 v8 5.8.283.41
8.1.3 v8 5.8.283.41
8.1.2 v8 5.8.283.41
8.1.1 v8 5.8.283.41
8.1.0 v8 5.8.283.41
8.0.0 v8 5.8.283.41
3% complete3% complete
7.10.1
(these versions have identical results)
7.10.1 v8 5.5.372.43
7.10.0 v8 5.5.372.43
7.9.0 v8 5.5.372.43
7.8.0 v8 5.5.372.43
7.7.4 v8 5.5.372.42
7.7.3 v8 5.5.372.41
7.7.2 v8 5.5.372.41
7.7.1 v8 5.5.372.41
7.7.0 v8 5.5.372.41
7.6.0 v8 5.5.372.40
3% complete3% complete
7.5.0
(these versions have identical results)
7.5.0 v8 5.4.500.48
7.4.0 v8 5.4.500.45
7.3.0 v8 5.4.500.45
7.2.1 v8 5.4.500.44
7.2.0 v8 5.4.500.43
7.1.0 v8 5.4.500.36
7.0.0 v8 5.4.500.36
3% complete3% complete
6.17.1
(these versions have identical results)
6.17.1 v8 5.1.281.111
6.17.0 v8 5.1.281.111
6.16.0 v8 5.1.281.111
6.15.1 v8 5.1.281.111
6.15.0 v8 5.1.281.111
6.14.4 v8 5.1.281.111
6.14.3 v8 5.1.281.111
6.14.2 v8 5.1.281.111
6.14.1 v8 5.1.281.111
6.14.0 v8 5.1.281.111
6.13.1 v8 5.1.281.111
6.13.0 v8 5.1.281.111
6.12.3 v8 5.1.281.111
6.12.2 v8 5.1.281.109
6.12.1 v8 5.1.281.109
6.12.0 v8 5.1.281.108
6.11.5 v8 5.1.281.108
6.11.4 v8 5.1.281.108
6.11.3 v8 5.1.281.107
6.11.2 v8 5.1.281.103
6.11.1 v8 5.1.281.103
6.11.0 v8 5.1.281.102
6.10.3 v8 5.1.281.101
6.10.2 v8 5.1.281.98
6.10.1 v8 5.1.281.95
6.10.0 v8 5.1.281.93
6.9.5 v8 5.1.281.89
6.9.4 v8 5.1.281.89
6.9.3 v8 5.1.281.89
6.9.2 v8 5.1.281.88
6.9.1 v8 5.1.281.84
6.9.0 v8 5.1.281.84
6.8.1 v8 5.1.281.84
6.8.0 v8 5.1.281.84
6.7.0 v8 5.1.281.83
6.6.0 v8 5.1.281.83
6.5.0 v8 5.1.281.81
3% complete3% complete
6.4.0
(these versions have identical results)
6.4.0 v8 5.0.71.60
6.3.1 v8 5.0.71.57
6.3.0 v8 5.0.71.52
6.2.2 v8 5.0.71.52
6.2.1 v8 5.0.71.52
6.2.0 v8 5.0.71.47
6.1.0 v8 5.0.71.35
6.0.0 v8 5.0.71.35
3% complete3% complete
5.12.0
(these versions have identical results)
5.12.0 v8 4.6.85.32
5.11.1 v8 4.6.85.31
5.11.0 v8 4.6.85.31
5.10.1 v8 4.6.85.31
5.10.0 v8 4.6.85.31
5.9.1 v8 4.6.85.31
5.9.0 v8 4.6.85.31
5.8.0 v8 4.6.85.31
5.7.1 v8 4.6.85.31
5.7.0 v8 4.6.85.31
5.6.0 v8 4.6.85.31
5.5.0 v8 4.6.85.31
5.4.1 v8 4.6.85.31
5.4.0 v8 4.6.85.31
5.3.0 v8 4.6.85.31
5.2.0 v8 4.6.85.31
5.1.1 v8 4.6.85.31
5.1.0 v8 4.6.85.31
5.0.0 v8 4.6.85.28
3% complete3% complete
4.9.1
(these versions have identical results)
4.9.1 v8 4.5.103.53
4.9.0 v8 4.5.103.53
4.8.7 v8 4.5.103.53
4.8.6 v8 4.5.103.53
4.8.5 v8 4.5.103.47
4.8.4 v8 4.5.103.47
4.8.3 v8 4.5.103.47
4.8.2 v8 4.5.103.46
4.8.1 v8 4.5.103.46
4.8.0 v8 4.5.103.45
4.7.3 v8 4.5.103.43
4.7.2 v8 4.5.103.43
4.7.1 v8 4.5.103.43
4.7.0 v8 4.5.103.43
4.6.2 v8 4.5.103.42
4.6.1 v8 4.5.103.37
4.6.0 v8 4.5.103.37
4.5.0 v8 4.5.103.37
4.4.7 v8 4.5.103.36
4.4.6 v8 4.5.103.36
4.4.5 v8 4.5.103.35
4.4.4 v8 4.5.103.35
4.4.3 v8 4.5.103.35
4.4.2 v8 4.5.103.35
4.4.1 v8 4.5.103.35
4.4.0 v8 4.5.103.35
4.3.2 v8 4.5.103.35
4.3.1 v8 4.5.103.35
4.3.0 v8 4.5.103.35
4.2.6 v8 4.5.103.35
4.2.5 v8 4.5.103.35
4.2.4 v8 4.5.103.35
4.2.3 v8 4.5.103.35
4.2.2 v8 4.5.103.35
4.2.1 v8 4.5.103.35
4.2.0 v8 4.5.103.35
4.1.2 v8 4.5.103.35
4.1.1 v8 4.5.103.33
4.1.0 v8 4.5.103.33
4.0.0 v8 4.5.103.30
3% complete3% complete
0.12.18
(these versions have identical results)
0.12.18 v8 3.28.71.20
3% complete3% complete
0.10.48
(these versions have identical results)
0.10.48 v8 3.14.5.11
3% complete3% complete

Stage 3

§ShadowRealm
?
function(){
return typeof ShadowRealm === "function" && ["evaluate", "importValue"].every(function(key){ return key in ShadowRealm.prototype; });
}
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
function(){
return typeof ShadowRealm === "function" && ["evaluate", "importValue"].every(function(key){ return key in ShadowRealm.prototype; });
}

Legacy RegExp features in JavaScript

§RegExp "lastMatch"
?
function(){
var re = /\w/; re.exec('x'); return RegExp.lastMatch === 'x';
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
var re = /\w/; re.exec('x'); return RegExp.lastMatch === 'x';
}
§RegExp.$1-$9
?
function(){
for (var i = 1; i < 10; i++) { if (!(('$' + i) in RegExp)) return false; } return true;
}
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
function(){
for (var i = 1; i < 10; i++) { if (!(('$' + i) in RegExp)) return false; } return true;
}

Stage 2

§Generator function.sent Meta Property
?
function(){
var result; function* generator() { result = function.sent; } var iter = generator(); iter.next('tromple'); return result === 'tromple';
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var result; function* generator() { result = function.sent; } var iter = generator(); iter.next('tromple'); return result === 'tromple';
}
§Array.isTemplateObject
?
function(){
return !Array.isTemplateObject([]) && Array.isTemplateObject((it => it)`a${1}c`);
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return !Array.isTemplateObject([]) && Array.isTemplateObject((it => it)`a${1}c`);
}

Class and Property Decorators

§class decorators
?
function(){
class A { @nonconf get B() {} } function nonconf(target, name, descriptor) { descriptor.configurable = false; return descriptor; } return Object.getOwnPropertyDescriptor(A.prototype, "B").configurable === false;
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class A { @nonconf get B() {} } function nonconf(target, name, descriptor) { descriptor.configurable = false; return descriptor; } return Object.getOwnPropertyDescriptor(A.prototype, "B").configurable === false;
}

throw expressions

§logical
?
function(){
var a, b; try { a = 19 || throw 77; b = 88 && throw 23; } catch (e) { return a + e === 42; }
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var a, b; try { a = 19 || throw 77; b = 88 && throw 23; } catch (e) { return a + e === 42; }
}
§parameter initializers
?
function(){
function fn (arg = throw 42) { return arg; } if (fn(21) !== 21) return false; try { fn(); } catch (e) { return e === 42; }
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
function fn (arg = throw 42) { return arg; } if (fn(21) !== 21) return false; try { fn(); } catch (e) { return e === 42; }
}
§arrow function bodies
?
function(){
var fn = () => throw 42; try { fn(); } catch (e) { return e === 42; }
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var fn = () => throw 42; try { fn(); } catch (e) { return e === 42; }
}
§conditionals
?
function(){
true ? 42 : throw 21; try { false ? 42 : throw 21; } catch (e) { return e === 21; }
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
true ? 42 : throw 21; try { false ? 42 : throw 21; } catch (e) { return e === 21; }
}

Set methods

§Set.prototype.intersection
?
function(){
var set = new Set([1, 2, 3]).intersection(new Set([2, 3, 4])); return set.size === 2 && set.has(2) && set.has(3);
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var set = new Set([1, 2, 3]).intersection(new Set([2, 3, 4])); return set.size === 2 && set.has(2) && set.has(3);
}
§Set.prototype.union
?
function(){
var set = new Set([1, 2]).union(new Set([2, 3])); return set.size === 3 && set.has(1) && set.has(2) && set.has(3);
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var set = new Set([1, 2]).union(new Set([2, 3])); return set.size === 3 && set.has(1) && set.has(2) && set.has(3);
}
§Set.prototype.difference
?
function(){
var set = new Set([1, 2, 3]).difference(new Set([3, 4])); return set.size === 2 && set.has(1) && set.has(2);
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var set = new Set([1, 2, 3]).difference(new Set([3, 4])); return set.size === 2 && set.has(1) && set.has(2);
}
§Set.prototype.symmetricDifference
?
function(){
var set = new Set([1, 2]).symmetricDifference(new Set([2, 3])); return set.size === 2 && set.has(1) && set.has(3);
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
var set = new Set([1, 2]).symmetricDifference(new Set([2, 3])); return set.size === 2 && set.has(1) && set.has(3);
}
§Set.prototype.isDisjointFrom
?
function(){
return new Set([1, 2, 3]).isDisjointFrom([4, 5, 6]);
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new Set([1, 2, 3]).isDisjointFrom([4, 5, 6]);
}
§Set.prototype.isSubsetOf
?
function(){
return new Set([1, 2, 3]).isSubsetOf([5, 4, 3, 2, 1]);
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new Set([1, 2, 3]).isSubsetOf([5, 4, 3, 2, 1]);
}
§Set.prototype.isSupersetOf
?
function(){
return new Set([5, 4, 3, 2, 1]).isSupersetOf([1, 2, 3]);
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return new Set([5, 4, 3, 2, 1]).isSupersetOf([1, 2, 3]);
}

ArrayBuffer.prototype.transfer

§ArrayBuffer.prototype.transfer()
?
function(){
const buffer1 = new Uint8Array([1, 2]).buffer; const buffer2 = buffer1.transfer(); return buffer1.byteLength === 0 && buffer2.byteLength === 2;
}
Yes
Yes
Yes
Yes
Yes
Yes
Error
Flag
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const buffer1 = new Uint8Array([1, 2]).buffer; const buffer2 = buffer1.transfer(); return buffer1.byteLength === 0 && buffer2.byteLength === 2;
}
§ArrayBuffer.prototype.realloc()
?
function(){
const buffer1 = new ArrayBuffer(1024); const buffer2 = buffer1.realloc(256); return buffer1.byteLength === 0 && buffer2.byteLength === 256;
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const buffer1 = new ArrayBuffer(1024); const buffer2 = buffer1.realloc(256); return buffer1.byteLength === 0 && buffer2.byteLength === 256;
}

Map.prototype.upsert

§Map.prototype.upsert
?
function(){
const map = new Map([['a', 1]]); if (map.upsert('a', it => 2, () => 3) !== 2) return false; if (map.upsert('b', it => 2, () => 3) !== 3) return false; return Array.from(map).join() === 'a,2,b,3';
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const map = new Map([['a', 1]]); if (map.upsert('a', it => 2, () => 3) !== 2) return false; if (map.upsert('b', it => 2, () => 3) !== 3) return false; return Array.from(map).join() === 'a,2,b,3';
}
§WeakMap.prototype.upsert
?
function(){
const a = {}, b = {}; const map = new WeakMap([[a, 1]]); if (map.upsert(a, it => 2, () => 3) !== 2) return false; if (map.upsert(b, it => 2, () => 3) !== 3) return false; return map.get(a) === 2 && map.get(b) === 3;
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const a = {}, b = {}; const map = new WeakMap([[a, 1]]); if (map.upsert(a, it => 2, () => 3) !== 2) return false; if (map.upsert(b, it => 2, () => 3) !== 3) return false; return map.get(a) === 2 && map.get(b) === 3;
}

Iterator Helpers

§instanceof Iterator
?
function(){
return [1, 2, 3].values() instanceof Iterator;
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return [1, 2, 3].values() instanceof Iterator;
}
§extends Iterator
?
function(){
class Class extends Iterator { } const instance = new Class(); return instance[Symbol.iterator]() === instance;
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class Class extends Iterator { } const instance = new Class(); return instance[Symbol.iterator]() === instance;
}
§Iterator.from, iterable
?
function(){
const iterator = Iterator.from([1, 2, 3]); return 'next' in iterator && iterator instanceof Iterator && Array.from(iterator).join() === '1,2,3';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const iterator = Iterator.from([1, 2, 3]); return 'next' in iterator && iterator instanceof Iterator && Array.from(iterator).join() === '1,2,3';
}
§Iterator.from, iterator
?
function(){
const iterator = Iterator.from({ i: 0, next() { return { value: ++this.i, done: this.i > 3 }; } }); return 'next' in iterator && iterator instanceof Iterator && Array.from(iterator).join() === '1,2,3';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const iterator = Iterator.from({ i: 0, next() { return { value: ++this.i, done: this.i > 3 }; } }); return 'next' in iterator && iterator instanceof Iterator && Array.from(iterator).join() === '1,2,3';
}
§Iterator.prototype.asIndexedPairs
?
function(){
return Array.from([1, 2, 3].values().asIndexedPairs()).join() === '0,1,1,2,2,3';
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Array.from([1, 2, 3].values().asIndexedPairs()).join() === '0,1,1,2,2,3';
}
§Iterator.prototype.drop
?
function(){
return Array.from([1, 2, 3].values().drop(1)).join() === '2,3';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Array.from([1, 2, 3].values().drop(1)).join() === '2,3';
}
§Iterator.prototype.every
?
function(){
return [1, 2, 3].values().every(it => typeof it === 'number');
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return [1, 2, 3].values().every(it => typeof it === 'number');
}
§Iterator.prototype.filter
?
function(){
return Array.from([1, 2, 3].values().filter(it => it % 2)).join() === '1,3';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Array.from([1, 2, 3].values().filter(it => it % 2)).join() === '1,3';
}
§Iterator.prototype.find
?
function(){
return [1, 2, 3].values().find(it => it % 2) === 1;
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return [1, 2, 3].values().find(it => it % 2) === 1;
}
§Iterator.prototype.flatMap
?
function(){
return Array.from([1, 2, 3].values().flatMap(it => [it, 0])).join() === '1,0,2,0,3,0';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Array.from([1, 2, 3].values().flatMap(it => [it, 0])).join() === '1,0,2,0,3,0';
}
§Iterator.prototype.forEach
?
function(){
let result = ''; [1, 2, 3].values().forEach(it => result += it); return result === '123';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let result = ''; [1, 2, 3].values().forEach(it => result += it); return result === '123';
}
§Iterator.prototype.map
?
function(){
return Array.from([1, 2, 3].values().map(it => it * it)).join() === '1,4,9';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Array.from([1, 2, 3].values().map(it => it * it)).join() === '1,4,9';
}
§Iterator.prototype.reduce
?
function(){
return [1, 2, 3].values().reduce((a, b) => a + b) === 6;
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return [1, 2, 3].values().reduce((a, b) => a + b) === 6;
}
§Iterator.prototype.some
?
function(){
return [1, 2, 3].values().some(it => typeof it === 'number');
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return [1, 2, 3].values().some(it => typeof it === 'number');
}
§Iterator.prototype.take
?
function(){
return Array.from([1, 2, 3].values().take(2)).join() === '1,2';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Array.from([1, 2, 3].values().take(2)).join() === '1,2';
}
§Iterator.prototype.toArray
?
function(){
const array = [1, 2, 3].values().toArray(); return Array.isArray(array) && array.join() === '1,2,3';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
const array = [1, 2, 3].values().toArray(); return Array.isArray(array) && array.join() === '1,2,3';
}
§Iterator.prototype[@@toStringTag]
?
function(){
return Iterator.prototype[Symbol.toStringTag] === 'Iterator';
}
Error
Flag
Error
Flag
Error
Flag
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return Iterator.prototype[Symbol.toStringTag] === 'Iterator';
}
§instanceof AsyncIterator
?
function(){
return (async function*() {})() instanceof AsyncIterator;
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return (async function*() {})() instanceof AsyncIterator;
}
§extends AsyncIterator
?
function(){
class Class extends AsyncIterator { } const instance = new Class(); return instance[Symbol.asyncIterator]() === instance;
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
class Class extends AsyncIterator { } const instance = new Class(); return instance[Symbol.asyncIterator]() === instance;
}
§AsyncIterator.from, async iterable
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } const iterator = AsyncIterator.from(async function*() { yield * [1, 2, 3] }()); if (!('next' in iterator) || !(iterator instanceof AsyncIterator)) return false; toArray(iterator).then(it => { if (it.join() === '1,2,3') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } const iterator = AsyncIterator.from(async function*() { yield * [1, 2, 3] }()); if (!('next' in iterator) || !(iterator instanceof AsyncIterator)) return false; toArray(iterator).then(it => { if (it.join() === '1,2,3') asyncTestPassed(); });
}
§AsyncIterator.from, iterable
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } const iterator = AsyncIterator.from([1, 2, 3]); if (!('next' in iterator) || !(iterator instanceof AsyncIterator)) return false; toArray(iterator).then(it => { if (it.join() === '1,2,3') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } const iterator = AsyncIterator.from([1, 2, 3]); if (!('next' in iterator) || !(iterator instanceof AsyncIterator)) return false; toArray(iterator).then(it => { if (it.join() === '1,2,3') asyncTestPassed(); });
}
§AsyncIterator.from, iterator
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } const iterator = AsyncIterator.from([1, 2, 3].values()); if (!('next' in iterator) || !(iterator instanceof AsyncIterator)) return false; toArray(iterator).then(it => { if (it.join() === '1,2,3') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } const iterator = AsyncIterator.from([1, 2, 3].values()); if (!('next' in iterator) || !(iterator instanceof AsyncIterator)) return false; toArray(iterator).then(it => { if (it.join() === '1,2,3') asyncTestPassed(); });
}
§AsyncIterator.prototype.asIndexedPairs
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray((async function*() { yield * [1, 2, 3] })().asIndexedPairs()).then(it => { if (it.join() === '0,1,1,2,2,3') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray((async function*() { yield * [1, 2, 3] })().asIndexedPairs()).then(it => { if (it.join() === '0,1,1,2,2,3') asyncTestPassed(); });
}
§AsyncIterator.prototype.drop
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().drop(1)).then(it => { if (it.join() === '2,3') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().drop(1)).then(it => { if (it.join() === '2,3') asyncTestPassed(); });
}
§AsyncIterator.prototype.every
?
function(){
(async function*() { yield * [1, 2, 3] })().every(it => typeof it === 'number').then(it => { if (it === true) asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function*() { yield * [1, 2, 3] })().every(it => typeof it === 'number').then(it => { if (it === true) asyncTestPassed(); });
}
§AsyncIterator.prototype.filter
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().filter(it => it % 2)).then(it => { if (it.join() === '1,3') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().filter(it => it % 2)).then(it => { if (it.join() === '1,3') asyncTestPassed(); });
}
§AsyncIterator.prototype.find
?
function(){
(async function*() { yield * [1, 2, 3] })().find(it => it % 2).then(it => { if (it === 1) asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function*() { yield * [1, 2, 3] })().find(it => it % 2).then(it => { if (it === 1) asyncTestPassed(); });
}
§AsyncIterator.prototype.flatMap
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().flatMap(it => [it, 0])).then(it => { if (it.join() === '1,0,2,0,3,0') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().flatMap(it => [it, 0])).then(it => { if (it.join() === '1,0,2,0,3,0') asyncTestPassed(); });
}
§AsyncIterator.prototype.forEach
?
function(){
let result = ''; (async function*() { yield * [1, 2, 3] })().forEach(it => result += it).then(() => { if (result === '123') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
let result = ''; (async function*() { yield * [1, 2, 3] })().forEach(it => result += it).then(() => { if (result === '123') asyncTestPassed(); });
}
§AsyncIterator.prototype.map
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().map(it => it * it)).then(it => { if (it.join() === '1,4,9') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().map(it => it * it)).then(it => { if (it.join() === '1,4,9') asyncTestPassed(); });
}
§AsyncIterator.prototype.reduce
?
function(){
(async function*() { yield * [1, 2, 3] })().reduce((a, b) => a + b).then(it => { if (it === 6) asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function*() { yield * [1, 2, 3] })().reduce((a, b) => a + b).then(it => { if (it === 6) asyncTestPassed(); });
}
§AsyncIterator.prototype.some
?
function(){
(async function*() { yield * [1, 2, 3] })().some(it => typeof it === 'number').then(it => { if (it === true) asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function*() { yield * [1, 2, 3] })().some(it => typeof it === 'number').then(it => { if (it === true) asyncTestPassed(); });
}
§AsyncIterator.prototype.take
?
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().take(2)).then(it => { if (it.join() === '1,2') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
async function toArray(iterator) { const result = []; for await (const it of iterator) result.push(it); return result; } toArray(async function*() { yield * [1, 2, 3] }().take(2)).then(it => { if (it.join() === '1,2') asyncTestPassed(); });
}
§AsyncIterator.prototype.toArray
?
function(){
(async function*() { yield * [1, 2, 3] })().toArray().then(it => { if (Array.isArray(it) && it.join() === '1,2,3') asyncTestPassed(); });
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
(async function*() { yield * [1, 2, 3] })().toArray().then(it => { if (Array.isArray(it) && it.join() === '1,2,3') asyncTestPassed(); });
}
§AsyncIterator.prototype[@@toStringTag]
?
function(){
return AsyncIterator.prototype[Symbol.toStringTag] === 'AsyncIterator';
}
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
Error
function(){
return AsyncIterator.prototype[Symbol.toStringTag] === 'AsyncIterator';
}