NativeScript | Desktop browsers | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Feature name | Current browser | NS 6.5 Android v8 |
NS 7.0 Android v8 |
NS 8.0 Android v8 |
NS 6.5 iOS JSC |
NS 7.0 iOS v8 |
NS 8.0 iOS v8 |
CH 89 | CH 90 | SF 14 Beta | SF TP | |
2016 features | ||||||||||||
§exponentiation (**) operator | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | ||
§basic support | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§assignment | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§early syntax error for unary negation without parens | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Array.prototype.includes | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | ||
§Array.prototype.includes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Array.prototype.includes is generic | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§%TypedArray%.prototype.includes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
2016 misc | ||||||||||||
§generator functions can't be used with "new" [1] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§generator throw() caught by inner generator [2] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§strict fn w/ non-strict non-simple params is error[3] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§nested rest destructuring, declarations [4] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§nested rest destructuring, parameters[5] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Proxy, "enumerate" handler removed [6] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Proxy internal calls, Array.prototype.includes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
2017 features | ||||||||||||
§Object static methods | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | ||
§Object.values | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Object.entries | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Object.getOwnPropertyDescriptors | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Object.getOwnPropertyDescriptors doesn't provide undefined descriptors | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§String padding | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§String.prototype.padStart | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§String.prototype.padEnd | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§trailing commas in function syntax | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§in parameter lists | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§in argument lists | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§async functions | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | ||
§return | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§throw | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§no line break between async and function | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§no "prototype" property | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§await | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§await, rejection | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§must await a value | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§can await non-Promise values | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§cannot await in parameters | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§async methods, object literals | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§async methods, classes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§async arrow functions in methods, classes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§async arrow functions | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§correct prototype chain | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§async function prototype, Symbol.toStringTag | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§async function constructor | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§shared memory and atomics | 17/17 | 17/17 | 17/17 | 0/17 | 17/17 | 16/17 | 17/17 | 17/17 | 0/17 | 0/17 | ||
§SharedArrayBuffer | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§SharedArrayBuffer[Symbol.species] | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§SharedArrayBuffer.prototype.byteLength | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§SharedArrayBuffer.prototype.slice | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§SharedArrayBuffer.prototype[Symbol.toStringTag] | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.add | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.and | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.compareExchange | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.exchange | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.wait | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.wake | Yes | Yes | Yes | No | Yes | No | Yes | Yes | No[7] | No[7] | ||
§Atomics.isLockFree | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.load | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.or | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.store | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.sub | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
§Atomics.xor | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No[7] | No[7] | ||
2017 misc | ||||||||||||
§RegExp "u" flag, case folding | No | No | No | Yes | No | No | Yes | Yes | Yes | Yes | ||
§arguments.caller removed | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
2017 annex b | ||||||||||||
§Object.prototype getter/setter methods | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | 16/16 | ||
§__defineGetter__ | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__defineGetter__, symbols | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__defineGetter__, ToObject(this) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__defineSetter__ | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__defineSetter__, symbols | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__defineSetter__, ToObject(this) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupGetter__ | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupGetter__, prototype chain | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupGetter__, symbols | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupGetter__, ToObject(this) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupGetter__, data properties can shadow accessors | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupSetter__ | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupSetter__, prototype chain | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupSetter__, symbols | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupSetter__, ToObject(this) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupSetter__, data properties can shadow accessors | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Proxy internal calls, getter/setter methods | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | ||
§__defineGetter__ | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__defineSetter__ | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupGetter__ | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§__lookupSetter__ | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§assignments allowed in for-in head in non-strict mode | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
2018 features | ||||||||||||
§object rest/spread properties | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§object rest properties | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§object spread properties | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Promise.prototype.finally | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | ||
§basic support | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§don't change resolution value | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§change rejection value | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | ||
§s (dotAll) flag for regular expressions | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§RegExp named capture groups | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§RegExp Lookbehind Assertions | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | No | No | ||
§RegExp Unicode Property Escapes | No | No | No | Yes | No | No | Yes | Yes | Yes | Yes | ||
§Asynchronous Iterators | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§async generators | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§for-await-of loops | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
2018 misc | ||||||||||||
§Proxy "ownKeys" handler, duplicate keys for non-extensible targets | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§template literal revision | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
2019 features | ||||||||||||
§Object.fromEntries | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§string trimming | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | 4/4 | ||
§String.prototype.trimLeft | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§String.prototype.trimRight | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§String.prototype.trimStart | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§String.prototype.trimEnd | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Array.prototype.{flat, flatMap}[8] | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | ||
§Array.prototype.flat | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Array.prototype.flatMap | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§flat and flatMap in Array.prototype[@@unscopables] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
2019 misc | ||||||||||||
§optional catch binding | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | ||
§basic | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§await | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§yield | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Symbol.prototype.description | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | ||
§basic | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§empty description | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§undefined description | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Function.prototype.toString revision | 7/7 | 7/7 | 7/7 | 4/7 | 7/7 | 7/7 | 7/7 | 7/7 | 4/7 | 4/7 | ||
§functions created with the Function constructor | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | ? | ? | ||
§arrows | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§[native code] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§class expression with implicit constructor | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§class expression with explicit constructor | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§unicode escape sequences in identifiers | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | ? | ? | ||
§methods and computed property names | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | ? | ? | ||
§JSON superset | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§LINE SEPARATOR can appear in string literals | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§PARAGRAPH SEPARATOR can appear in string literals | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Well-formed JSON.stringify | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
2020 features | ||||||||||||
§String.prototype.matchAll | 2/2 | 2/2 | 2/2 | 1/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§basic functionality | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§throws on non-global regex | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§BigInt | 8/8 | 8/8 | 8/8 | 0/8 | 8/8 | 8/8 | 8/8 | 8/8 | 4/8 | 8/8 | ||
§basic functionality | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§constructor | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§BigInt.asUintN | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§BigInt.asIntN | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§BigInt64Array | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | ? | Yes | ||
§BigUint64Array | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | ? | Yes | ||
§DataView.prototype.getBigInt64 | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | ? | Yes | ||
§DataView.prototype.getBigUint64 | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | ? | Yes | ||
§Promise.allSettled | ? | ? | ? | ? | ? | ? | Yes | Yes | Yes | Yes | ||
§globalThis | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§"globalThis" global property is global object | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§"globalThis" global property has correct property descriptor | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||
§optional chaining operator (?.) | 4/5 | 4/5 | 4/5 | 0/5 | 4/5 | 4/5 | 4/5 | 4/5 | 5/5 | 5/5 | ||
§optional property access | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§optional bracket access | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§optional method call | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§optional function call | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§spread parameters after optional chaining | No | No | No | No | No | No | No | No | Yes | Yes | ||
§nullish coalescing operator (??) | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
2021 features | ||||||||||||
§String.prototype.replaceAll | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§Promise.any | 0/2 | 0/2 | 0/2 | 0/2 | 0/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§fulfillment | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§AggregateError | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§WeakReferences | 0/2 | 0/2 | 0/2 | 0/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||
§WeakRef minimal support | No | No | No | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§FinalizationRegistry minimal support | No | No | No | No | Yes | Yes | Yes | Yes | Yes | Yes | ||
§Logical Assignment | 0/9 | 0/9 | 0/9 | 0/9 | 0/9 | 9/9 | 9/9 | 9/9 | 9/9 | 9/9 | ||
§||= basic support | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§||= short-circuiting behaviour | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§||= setter not unecessarily invoked | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§&&= basic support | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§&&= short-circuiting behaviour | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§&&= setter not unecessarily invoked | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§??= basic support | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§??= short-circuiting behaviour | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§??= setter not unecessarily invoked | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | ||
§numeric separators | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
[1] TC39 meeting notes from July 28, 2015.
[2] 'Semantics of yield* in throw case' GitHub issue in ECMA-262 repo.
[3] TC39 meeting notes from July 29, 2015.
[4] TC39 meeting notes from July 28, 2015.
[5] TC39 meeting notes from July 28, 2015.
[8] Name of Array.prototype.flatten()
changed to Array.prototype.flat()
due to web compatibility issues.