blob: 17d083e8b0efe16b1cdcb951e87dc8e5cee14818 [file] [log] [blame] [view]
scottchen84ef86ca2016-12-06 01:14:531<!-- This is feature markdown template
2## Header
3
4**Usage Example:**
5
6``` js
7
8```
9
10**Documentation:** [link]()
11
12**Discussion Notes / Link to Thread:**
13
14hyphen-hyphen-hyphen (change to actual hyphen)
15
16-->
17
18
19<style type="text/css">
20 .doc {
21 font-size: 16px;
22 }
23
24 .doc h2[id] {
25 line-height: 20px;
26 font-size: 16px;
27 }
28
29 .doc h2 > code {
30 font-size: 16px;
31 font-weight: bold;
32 }
33
34 .feature-container {
35 background-color: #e8eef7;
36 border: 1px solid #c3d9ff;
37 margin-bottom: 5px;
38 border-radius: 5px;
39 }
40
41 .feature-container > h2 {
42 cursor: pointer;
43 background-color: #c3d9ff;
44 margin: 0;
45 padding: 5px;
46 border-radius: 5px;
47 }
48
49 .feature-container > *:not(h2){
50 display: none;
51 padding: 0px 10px;
52 }
53
54 .feature-container.open > *:not(h2){
55 display: block;
56 }
57</style>
58
59<script>
60document.addEventListener("DOMContentLoaded", function(event) {
61 // Move all headers and corresponding contents to an accordion container.
62 document.querySelectorAll('h2[id]').forEach(function(header){
63 var container = document.createElement('div');
64 container.classList.add('feature-container');
65 header.parentNode.insertBefore(container, header);
66
67 // Add all the following siblings until it hits an <hr>
68 var ele = header;
69 while(ele && ele.tagName !== 'HR') {
70 var nextEle = ele.nextElementSibling;
71 container.append(ele);
72 ele = nextEle;
73 }
74
75 // Add handler to open accordion on click.
76 header.addEventListener('click', () => {
77 header.parentNode.classList.toggle('open');
78 });
79 });
80
81 // Then remove all <hr>s since everything's accordionized.
82 document.querySelectorAll('hr').forEach(function(ele){
83 ele.parentNode.removeChild(ele);
84 });
85});
86</script>
87
88[TOC]
89
90# ES6 Support In Chromium
91
92This is a list of new/updated features in ES6 specs that is being considered to
93be supported for Chromium development.
94
95>**TBD:** Do we want to differenciate allow/ban status between subprojects? If
96so, how to denote?
97
98>**TBD:** Cross platform-build support?
99
100You can propose changing the status of a feature by sending an email to
101[email protected]. Include a short blurb on what the feature is and why
102you think it should or should not be allowed, along with links to any relevant
103previous discussion. If the list arrives at some consensus, send a codereview
104to change this file accordingly, linking to your discussion thread.
105
106>Some descriptions and Usage examples are from [kangax](https://kangax.github.
107io/compat-table/es6/) and [http://es6-features.org/](http://es6-features.org/)
108
109# Allowed Features
110
111The following features are allowed in Chromium development.
112
113## `Promise`
114
115Built-in representation of a value that might be determined asynchronously,
116relieving developers from "callback hell".
117
118**Usage Example:**
119
120``` js
121function promiseA() {
122 return new Promise((resolve, reject) => setTimeout(resolve, 100));
123}
124
125function promiseB() {
126 return new Promise((resolve, reject) => setTimeout(resolve, 200));
127}
128
129function promiseC() {
130 return new Promise((resolve, reject) => setTimeout(resolve, 300));
131}
132
133Promise.all([promiseA(), promiseB(), promiseC()]).then(([a, b, c]) => {
134 someFunction(a, b, c);
135});
136```
137
138**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
139/#sec-promise-objects)
140
141**Discussion Notes:** Feature already extensively used prior to creation of
142this document.
143
144---
145
146# Banned Features
147
148The following features are banned for Chromium development.
149
150# Features To Be Discussed
151
152The following features are currently disallowed. See the top of this page on
153how to propose moving a feature from this list into the allowed or banned
154sections.
155
156## `let` (Block-Scoped Variables)
157
158Declare variable that exists within the block scope. `let` can generally be
159used to replace `var` but `let` in global scope, unlike `var`, does not
160introduce a property on the global object.
161
162**Usage Example:**
163
164``` js
165// This will make all buttons output "3".
166for(var i = 0; i < 3; i++) {
167 buttons[i].onclick = function() {
168 console.log(i);
169 };
170}
171
172// This will make buttons output corresponding "i" values.
173for(let i = 0; i < 3; i++) {
174 buttons[i].onclick = function() {
175 console.log(i);
176 };
177}
178
179var bar = 1;
180var bar = 1; // No error thrown.
181
182let foo = 1;
183let foo = 1; // TypeError: Identifier 'foo' has already been declared.
184```
185
186**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
187/#sec-let-and-const-declarations)
188
189**Discussion Notes / Link to Thread:**
190
191---
192
193## `const` (Block-Scoped Constants)
194
195Constants (also known as "immutable variables") are variables which cannot be
196re-assigned new content. Note that if the value is an object, the object itself
197is still mutable.
198
199`const` has traditionally been supported as a "function scoped" declaration
200like `var` (except in Internet Explorer), however in VMs supporting ES6 `const`
201is now a block scope declaration.
202
203**Usage Example:**
204
205``` js
206const gravity = 9.81;
207gravity = 0; // TypeError: Assignment to constant variable.
208
209gravity === 9.81; // true
210```
211
212**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
213/#sec-let-and-const-declarations)
214
215**Discussion Notes / Link to Thread:**
216
217---
218
219## `=>` (Arrow Functions)
220
221Arrow functions provide a concise syntax to create a function, and fix a number
222of difficulties with this (e.g. eliminating the need to write `const self =
223this`. Particularly useful for nested functions or callbacks.
224
225Prefer arrow functions over the function keyword, over `f.bind(this)`, and
226especially over `goog.bind(f, this)`.
227
228Arrow functions has an implicit return when used without a body block.
229
230**Usage Example:**
231
232``` js
233// General usage, eliminating need for .bind(this).
234setTimeout(() => {
235 this.doSomething();
236}, 1000); // no need for .bind(this) or const self = this.
237
238// Another example...
239window.addEventListener('scroll', (event) => {
240 this.doSomething(event);
241}); // no need for .bind(this) or const self = this.
242
243// Implicit return: returns the value if expression not inside a body block.
244() => 1 // returns 1
245() => {1} // returns undefined - body block does not implicitly return.
246() => {return 1;} // returns 1
247```
248
249**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
250/#sec-arrow-function-definitions)
251
252**Discussion Notes / Link to Thread:**
253
254---
255
256## Classes
257
258OOP-style and boilerplate-free class syntax, including inheritance, super(),
259static members, and getters and setters.
260
261**Usage Example:**
262
263``` js
264class Rectangle extends Shape {
265 constructor(id, x, y, width, height) {
266 super(id, x, y);
267 this.width = width;
268 this.height = height;
269 }
270 static defaultRectangle() {
271 return new Rectangle('default', 0, 0, 100, 100);
272 }
273 move(x, y) {
274 this.x = x;
275 this.y = y;
276 }
277};
278```
279
280**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
281/#sec-class-definitions)
282
283**Discussion Notes / Link to Thread:**
284
285---
286
287## Block Scope Functions
288
289**Usage Example:**
290
291``` js
292{
293 function foo() {
294 return 1;
295 }
296 // foo() === 1
297 {
298 function foo() {
299 return 2;
300 }
301 // foo() === 2
302 }
303 // foo() === 1
304}
305```
306
307**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
308/#sec-functiondeclarationinstantiation)
309
310**Discussion Notes / Link to Thread:**
311
312---
313
314## Default Function Parameters
315
316**Usage Example:**
317
318``` js
319function f(x, y = 7, z = 42) {
320 return x + y + z;
321}
322// f(1) === 50;
323```
324
325**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
326/#sec-functiondeclarationinstantiation)
327
328**Discussion Notes / Link to Thread:**
329
330---
331
332## Rest Parameters
333
334Aggregation of function arguments into one Array variable.
335
336**Usage Example:**
337
338``` js
339function f(x, y, ...a) {
340 // for f(1, 2, 3, 4, 5)...
341 // x = 1, y = 2
342 // a = [3, 4, 5]
343}
344```
345
346**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
347/#sec-function-definitions)
348
349**Discussion Notes / Link to Thread:**
350
351---
352
353## Spread Operators
354
355Spreading the elements from an iterable collection into individual literals as
356function parameters.
357
358**Usage Example:**
359
360``` js
361// Spreading an Array
362var params = [ 'hello', true, 7 ];
363var other = [ 1, 2, ...params ]; // [ 1, 2, 'hello', true, 7 ]
364f(1, 2, ...params) === 9;
365
366// Spreading a String
367var str = 'foo';
368var chars = [ ...str ]; // [ 'f', 'o', 'o' ]
369```
370
371**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
372/#sec-argument-lists-runtime-semantics-argumentlistevaluation)
373
374**Discussion Notes / Link to Thread:**
375
376---
377
378## Object Literal Extensions
379
380Convenient new ways for object property definition.
381
382**Usage Example:**
383
384``` js
385// Computed property name
386var x = 'key';
387var obj = {[x]: 1};
388
389// Shorthand property
390var obj = {x, y}; //equivalent to {x:x, y:y}
391
392// Method property
393var obj = {
394 foo() {...},
395 bar() {...}
396}
397```
398
399**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
400/#sec-object-initialiser)
401
402**Discussion Notes / Link to Thread:**
403
404---
405
406## Template Literals
407
408Expression interpolation for Strings, with the ability to access raw template
409pieces.
410
411**Usage Example:**
412
413``` js
414// Simple example
415var greeting = 'hello';
416var myName = {first: 'Foo', last: 'Bar'};
417var message = `${greeting},
418my name is ${myName.first + myName.last}`;
419// message == 'hello,\nmy name is FooBar'
420
421// Custom interpolation
422function foo (strings, ...values) {
423 // for foo`bar${42}baz`...
424 // strings[0] === 'bar';
425 // strings[1] === 'baz';
426 // values[0] === 42;
427
428 return strings[1] + strings[0] + values[0];
429}
430
431var newString = foo`bar${42}baz`; // 'bazbar42'
432```
433
434**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
435/#sec-template-literals)
436
437**Discussion Notes / Link to Thread:**
438
439---
440
441## Binary & Octal Literals
442
443**Usage Example:**
444
445``` js
4460b111110111 === 503;
4470o767 === 503;
448```
449
450**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
451/#sec-literals-numeric-literals)
452
453**Discussion Notes / Link to Thread:**
454
455---
456
457## `/u` Unicode Regex Literal
458
459**Usage Example:**
460
461``` js
462'ð ®·'.match(/./u)[0].length === 2;
463```
464
465**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
466/#sec-get-regexp.prototype.sticky)
467
468**Discussion Notes / Link to Thread:**
469
470---
471
472## `\u{}` Unicode String
473
474**Usage Example:**
475
476``` js
477'\u{1d306}' == '\ud834\udf06'; // true
478```
479
480**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
481/#sec-literals-string-literals)
482
483**Discussion Notes / Link to Thread:**
484
485---
486
487## `/y` Regex Sticky Matching
488
489Keep the matching position sticky between matches and this way support
490efficient parsing of arbitrary long input strings, even with an arbitrary
491number of distinct regular expressions.
492
493**Usage Example:**
494
495``` js
496var re = new RegExp('yy', 'y');
497re.lastIndex = 3;
498var result = re.exec('xxxyyxx')[0];
499result === 'yy' && re.lastIndex === 5; // true
500```
501
502**Documentation:** [link](http://es6-features.org
503/#RegularExpressionStickyMatching)
504
505**Discussion Notes / Link to Thread:**
506
507---
508
509## Destructuring Assignment
510
511Flexible destructuring of collections or parameters.
512
513**Usage Example:**
514
515``` js
516// Array
517var list = [ 1, 2, 3 ];
518var [ a, , b ] = list;
519// a = 1, b = 3
520
521// Object
522var {width, height, area: a} = rect;
523// width = rect.width, height = rect.height, a = rect.area
524
525// Parameters
526function f ([ name, val ]) {
527 console.log(name, val);
528}
529function g ({ name: n, val: v }) {
530 console.log(n, v);
531}
532function h ({ name, val }) {
533 console.log(name, val);
534}
535
536f([ 'bar', 42 ]);
537g({ name: 'foo', val: 7 });
538h({ name: 'bar', val: 42 });
539
540```
541
542**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
543/#sec-destructuring-assignment)
544
545**Discussion Notes / Link to Thread:**
546
547---
548
549## Modules
550
551Support for exporting/importing values from/to modules without global
552namespace pollution.
553
554**Usage Example:**
555
556``` js
557// lib/rect.js
558export function getArea() {...};
559export { width, height, unimportant };
560
561// app.js
562import {getArea, width, height} from 'lib/rect';
563
564```
565
566**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
567/#sec-modules)
568
569**Discussion Notes / Link to Thread:**
570
571---
572
573## Symbol Type
574
575Unique and immutable data type to be used as an identifier for object
576properties.
577
578**Usage Example:**
579
580``` js
581const foo = Symbol();
582const bar = Symbol();
583typeof foo === 'symbol'; // true
584typeof bar === 'symbol'; // true
585let obj = {};
586obj[foo] = 'foo';
587obj[bar] = 'bar';
588JSON.stringify(obj); // {}
589Object.keys(obj); // []
590Object.getOwnPropertyNames(obj); // []
591Object.getOwnPropertySymbols(obj); // [ foo, bar ]
592```
593
594**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
595/#sec-symbol-constructor)
596
597**Discussion Notes / Link to Thread:**
598
599---
600
601## `for ...of` Loops
602
603Convenient operator to iterate over all values of an iterable object.
604
605**Usage Example:**
606
607``` js
608// Given an iterable collection `fibonacci`...
609for (let n of fibonacci) {
610 console.log(n);
611}
612```
613
614**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
615/#sec-for-in-and-for-of-statements)
616
617**Discussion Notes / Link to Thread:**
618
619---
620
621## Object Static Methods
622
623**Usage Example:**
624
625``` js
626// Object.assign
627var o = Object.assign({a:true}, {b:true}, {c:true});
628'a' in o && 'b' in o && 'c' in o; // true
629
630// Object.setPrototypeOf
631Object.setPrototypeOf({}, Array.prototype) instanceof Array; //true
632
633// Object.is
634// Object.getOwnPropertySymbols
635```
636
637**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
638/#sec-properties-of-the-object-constructor)
639
640**Discussion Notes / Link to Thread:**
641
642---
643
644## String Static & Prototype methods
645
646**Usage Example:**
647
648``` js
649// String.raw
650// String.fromCodePoint
651
652// String.prototype.codePointAt
653// String.prototype.normalize
654// String.prototype.repeat
655// String.prototype.startsWith
656// String.prototype.endsWith
657// String.prototype.includes
658```
659
660**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
661/#sec-properties-of-the-string-constructor)
662
663**Discussion Notes / Link to Thread:**
664
665---
666
667## Array Static & Prototype Methods
668
669**Usage Example:**
670
671``` js
672// Array.from
673// Array.of
674
675// Array.prototype.copyWithin
676// Array.prototype.find
677// Array.prototype.findIndex
678// Array.prototype.fill
679// Array.prototype.keys
680// Array.prototype.values
681// Array.prototype.entries
682```
683
684**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
685/#sec-properties-of-the-array-constructor)
686
687**Discussion Notes / Link to Thread:**
688
689---
690
691## Number Properties
692
693**Usage Example:**
694
695``` js
696// Number.isFinite
697// Number.isInteger
698// Number.isSafeInteger
699// Number.isNaN
700// Number.EPSILON
701// Number.MIN_SAFE_INTEGER
702// Number.MAX_SAFE_INTEGER
703```
704
705**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
706/#sec-isfinite-number)
707
708**Discussion Notes / Link to Thread:**
709
710---
711
712## Iterators
713
714**Usage Example:**
715
716``` js
717let fibonacci = {
718 [Symbol.iterator]() {
719 let pre = 0, cur = 1;
720 return {
721 next () {
722 [ pre, cur ] = [ cur, pre + cur ];
723 return { done: false, value: cur };
724 }
725 };
726 }
727};
728```
729
730**Documentation:** [link]()
731
732**Discussion Notes / Link to Thread:**
733
734---
735
736## Generators
737
738Special iterators with specified pausing points.
739
740**Usage Example:**
741
742``` js
743function* range(start, end, step) {
744 while (start < end) {
745 yield start;
746 start += step;
747 }
748}
749
750for (let i of range(0, 10, 2)) {
751 console.log(i); // 0, 2, 4, 6, 8
752}
753
754```
755
756**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
757/#sec-generator-function-definitions)
758
759**Discussion Notes / Link to Thread:**
760
761---
762
763## `Map`
764
765**Usage Example:**
766
767``` js
768var key = {};
769var map = new Map();
770
771map.set(key, 123);
772
773map.has(key) && map.get(key) === 123; // true
774```
775
776**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
777/#sec-map-objects)
778
779**Discussion Notes / Link to Thread:**
780
781---
782
783## `Set`
784
785**Usage Example:**
786
787``` js
788var obj = {};
789var set = new Set();
790
791set.add(123);
792set.add(123);
793
794set.has(123); // true
795```
796
797**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
798/#sec-set-objects)
799
800**Discussion Notes / Link to Thread:**
801
802---
803
804## `WeakMap`
805
806WeakMap does not prevent garbage collection if nothing else refers to an object
807within the collection.
808
809**Usage Example:**
810
811``` js
812var key = {};
813var weakmap = new WeakMap();
814
815weakmap.set(key, 123);
816
817weakmap.has(key) && weakmap.get(key) === 123; // true
818```
819
820**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
821/#sec-weakmap-objects)
822
823**Discussion Notes / Link to Thread:**
824
825---
826
827## `WeakSet`
828
829WeakSet does not prevent garbage collection if nothing else refers to an object
830within the collection.
831
832**Usage Example:**
833
834``` js
835var obj1 = {};
836var weakset = new WeakSet();
837
838weakset.add(obj1);
839weakset.add(obj1);
840
841weakset.has(obj1); // true
842```
843
844**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
845/#sec-weakset-objects)
846
847**Discussion Notes / Link to Thread:**
848
849---
850
851## Typed Arrays
852
853A lot of new typed Arrays...
854
855**Usage Example:**
856
857``` js
858new Int8Array();
859new UInt8Array();
860new UInt8ClampedArray()
861// ...You get the idea. Click on the Documentation link below to see all.
862```
863
864**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
865/#sec-typedarray-objects)
866
867**Discussion Notes / Link to Thread:**
868
869---
870
871## `Proxy`
872
873Hooking into runtime-level object meta-operations.
874
875**Usage Example:**
876
877``` js
878let target = {
879 foo: 'Welcome, foo'
880};
881let proxy = new Proxy(target, {
882 get (receiver, name) {
883 return name in receiver ? receiver[name] : `Hello, ${name}`;
884 }
885});
886proxy.foo === 'Welcome, foo'; // true
887proxy.world === 'Hello, world'; // true
888```
889
890**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
891/#sec-proxy-object-internal-methods-and-internal-slots)
892
893**Discussion Notes / Link to Thread:**
894
895---
896
897## `Reflection`
898
899Make calls corresponding to the object meta-operations.
900
901**Usage Example:**
902
903``` js
904let obj = { a: 1 };
905Object.defineProperty(obj, 'b', { value: 2 });
906obj[Symbol('c')] = 3;
907Reflect.ownKeys(obj); // ['a', 'b', Symbol(c)]
908```
909
910**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
911/#sec-reflection)
912
913**Discussion Notes / Link to Thread:**
914
915---
916
917## Math Methods
918
919A lot of new Math methods.
920
921**Usage Example:**
922
923``` js
924// See Doc
925```
926
927**Documentation:** [link](http://www.ecma-international.org/ecma-262/6.0
928/#sec-math)
929
930**Discussion Notes / Link to Thread:**
931
932---