Slide 1

Slide 1 text

ES2015 ͷݱࡏͱ ESNext ͷະདྷ @yosuke_furukawa in HTML Party ͔͝Μ·

Slide 2

Slide 2 text

Twitter: @yosuke_furukawa Github: yosuke-furukawa

Slide 3

Slide 3 text

࠷ۙ

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

ࡱӨ͞Εͨসإ

Slide 6

Slide 6 text

ࢠͲ΋͕ੜ·ΕͨͷͰجຊ΍ͬ ͯΔͷ͸ ύύͱOSSίϛολʔ

Slide 7

Slide 7 text

JavaScript

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

JavaScript is the world’s most misunderstood Programming Language — Douglas Crockford

Slide 12

Slide 12 text

JavaScript Trap Examples

Slide 13

Slide 13 text

JavaScript Traps 1 var test = 'global'; function foo() { console.log(test); // global?? local?? if (true) { var test = 'local'; console.log(test); // global?? local?? } } foo();

Slide 14

Slide 14 text

JavaScript Traps 1 var test = 'global'; function foo() { console.log(test); // undefined if (true) { var test = 'local'; console.log(test); // local } } foo();

Slide 15

Slide 15 text

JavaScript Traps 1 var test = 'global'; function foo() { var test; console.log(test); // undefined if (true) { test = 'local'; console.log(test); // local } } foo(); ࣮ࡍͷ&OHJOFͷ ղऍ͸͜͏ͳΔ

Slide 16

Slide 16 text

JavaScript Traps 1 var test = 'global'; function foo() { console.log(test); // global?? local?? if (true) { var test = 'local'; console.log(test); // global?? local?? } } foo(); ר্͖͛ࣄނ

Slide 17

Slide 17 text

JavaScript Traps 2 var Alice = function() { this.name = 'Alice'; }; Alice.prototype.printNameInteval = function() { console.log(this.name); // Alice? setInterval(function() { console.log(this.name); // Alice??? }, 1000); }; var alice = new Alice(); alice.printNameInteval();

Slide 18

Slide 18 text

JavaScript Traps 2 var Alice = function() { this.name = 'Alice'; }; Alice.prototype.printNameInteval = function() { console.log(this.name); // Alice setInterval(function() { console.log(this.name); // undefined }, 1000); }; var alice = new Alice(); alice.printNameTick();

Slide 19

Slide 19 text

JavaScript Traps 2 var Alice = function() { this.name = 'Alice'; }; Alice.prototype.printNameTick = function() { console.log(this.name); // this => Alice setInterval(function() { console.log(this.name); // this => ????? (browser͸window, node ͸ Timer }, 1000); }; var alice = new Alice(); alice.printNameTick(); UIJT͕ࢦ͍ͯ͠Δ΋ͷ͕ มΘΔ

Slide 20

Slide 20 text

JavaScript Traps 2 var Alice = function() { this.name = 'Alice'; }; Alice.prototype.printNameTick = function() { console.log(this.name); // Alice setInterval(function() { console.log(this.name); // undefined }, 1000); }; var alice = new Alice(); alice.printNameTick(); ϰΝχογϡUIJT

Slide 21

Slide 21 text

JavaScript Traps 3 var fs = require('fs'); var getLastModified = function(dir, done) { fs.readdir(function(err, files) { var timestamps = []; files.forEach(function(file) { fs.stat(file, function(err, stat) { timestamps.push(stat.mtime); if (timestamps.length === files.length) { done(null, timestamps); } }); }); }); }; getLastModified('.', function(err, results) { console.log(results); });

Slide 22

Slide 22 text

JavaScript Traps 3 var fs = require('fs'); var getLastModified = function(dir, done) { fs.readdir(function(err, files) { var timestamps = []; files.forEach(function(file) { fs.stat(file, function(err, stat) { timestamps.push(stat.mtime); if (timestamps.length === files.length) { done(null, timestamps); } }); }); }); }; getLastModified('trap3.js', function(err, results) { console.log(results); }); DBMMCBDLIFMM

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

ES2015

Slide 25

Slide 25 text

ES2015ʁ • JavaScript ͷ৽͍͠ *ن֨* • ਖ਼໊ࣜশ͸ ECMA-262 • ௨শ ECMAScript • ECMA International ஂମ͕ఆٛ • ͋͘·Ͱن֨Ͱ࣮͋ͬͯ૷Ͱ͸ͳ͍

Slide 26

Slide 26 text

ES6? ES7? • ECMA-262(௨শ ECMAScript) 6th Edition ͳ ͷͰ ES6 • ࠓ೥͸ ES7 • ͨͩ΋͏͜ͷݺশ͸ͦΜͳසൟʹ࢖Θͳ͍ • ৄ͘͠͸ޙͰઆ໌͢Δ

Slide 27

Slide 27 text

ES2015 ͸͖ͬ͞ͷ᠘Λճආ ͢ΔͨΊͷ๷۩

Slide 28

Slide 28 text

avoid traps using ES2015

Slide 29

Slide 29 text

JavaScript Traps 1 var test = 'global'; function foo() { console.log(test); // global?? local?? if (true) { var test = 'local'; console.log(test); // global?? local?? } } foo(); ר্͖͛ࣄނ

Slide 30

Slide 30 text

Use let or const

Slide 31

Slide 31 text

JavaScript Traps 1 const test = 'global'; function foo() { console.log(test); // global if (true) { const test = 'local'; console.log(test); // local } } foo();

Slide 32

Slide 32 text

JavaScript Traps 1 const test = 'global'; function foo() { console.log(test); // global if (true) { const test = 'local'; console.log(test); // local } } foo(); LGTM

Slide 33

Slide 33 text

let ͱ const • block scope ͱݴͬͯม਺είʔϓ͕ϒϨʔε{}ͷதʹ ด͡Δ • let ͸࠶୅ೖՄೳͳม਺ • const ͸࠶୅ೖෆՄೳͳม਺ • جຊతʹ͸ const Λ࢖ͬͯ let ͸୅ೖՄೳͳ΋ͷʹͷ Έ࢖͏ͷ͕ίʔυϚφʔʹͳΓͭͭ͋Δ

Slide 34

Slide 34 text

JavaScript Traps 2 var Alice = function() { this.name = 'Alice'; }; Alice.prototype.printNameTick = function() { console.log(this.name); // Alice setInterval(function() { console.log(this.name); // undefined }, 1000); }; var alice = new Alice(); alice.printNameTick(); ϰΝχογϡUIJT

Slide 35

Slide 35 text

Use arrow function

Slide 36

Slide 36 text

JavaScript Traps 2 var Alice = function() { this.name = 'Alice'; }; Alice.prototype.printNameTick = function() { console.log(this.name); // Alice setInterval(() => { console.log(this.name); // Alice }, 1000); }; var alice = new Alice(); alice.printNameTick();

Slide 37

Slide 37 text

JavaScript Traps 2 var Alice = function() { this.name = 'Alice'; }; Alice.prototype.printNameTick = function() { console.log(this.name); // Alice setInterval(() => { console.log(this.name); // Alice }, 1000); }; var alice = new Alice(); alice.printNameTick(); LGTM

Slide 38

Slide 38 text

arrow function • Ξϩʔؔ਺ͱݴͬͯ this ͕Ξϩʔؔ਺಺ʹଋ റ͞ΕΔ • ؔ਺ͷதͰthisΛ࢖͏࣌ʹ͍͍ͪͪbind͢Δඞ ཁ͕ͳ͍ɻ // ͜͏͍͏࣌ʹ΋࢖͏ɻ [1,2,3,4,5,6,7,8,9].filter(n => n % 2 === 0).reduce(prev, curr => prev + curr);

Slide 39

Slide 39 text

͍ͭͰʹ֮͑Α͏ class

Slide 40

Slide 40 text

class class Alice { constructor() { this.name = 'Alice'; } printNameTick() { console.log(this.name); // Alice setInterval(() => { console.log(this.name); // Alice }, 1000); } } var alice = new Alice(); alice.printNameTick(); LVGTM

Slide 41

Slide 41 text

class • JavaScript Ͱ class Λ࡞ΕΔΑ͏ʹͳͬͨ • ͜Ε·Ͱͷ prototype ͷԆ௕ • ܧঝͱ͔΋Մೳ class Alice extends Person { }

Slide 42

Slide 42 text

JavaScript Traps 3 var fs = require('fs'); var getLastModified = function(dir, done) { fs.readdir(function(err, files) { var timestamps = []; files.forEach(function(file) { fs.stat(file, function(err, stat) { timestamps.push(stat.mtime); if (timestamps.length === files.length) { done(null, timestamps); } }); }); }); }; getLastModified('trap3.js', function(err, results) { console.log(results); }); DBMMCBDLIFMM

Slide 43

Slide 43 text

Use Promise

Slide 44

Slide 44 text

JavaScript Traps 3 const fs = require('fs'); const promisify = require('./promisify'); const readdir = promisify(fs.readdir); const stat = promisify(fs.stat); const getLastModified = (dir) => { return readdir(dir).then((files) => { const results = files.map((file) => stat(file)); return Promise.all(results); }).then((stats) => stats.map(stat => stat.mtime)); }; getLastModified('.').then(results => { console.log(results); });

Slide 45

Slide 45 text

JavaScript Traps 3 const fs = require('fs'); const promisify = require('./promisify'); const readdir = promisify(fs.readdir); const stat = promisify(fs.stat); const getLastModified = (dir) => { return readdir(dir).then((files) => { const results = files.map((file) => stat(file)); return Promise.all(results); }).then((stats) => stats.map(stat => stat.mtime)); }; getLastModified('.').then(results => { console.log(results); }); LGTM

Slide 46

Slide 46 text

Promise • ඇಉظॲཧͷݺͼग़͠Λந৅Խͨ͠΋ͷ • then Ͱ੒ޭ࣌ͷݺͼग़͠ɺ catch Ͱࣦഊ࣌ͷྫ֎͕औ ಘͰ͖Δ • then Ͱܨ͙͜ͱͰ callback hell Λճආ͢Δ • ※NodeͷAPI͸·ͩPromiseʹͳͬͯͳ͍ͷͰผ్ PromiseԽ͢Δॲཧ(Promisify) ͕ඞཁ

Slide 47

Slide 47 text

͍ͭͰʹ֮͑Α͏ generator/yield

Slide 48

Slide 48 text

JavaScript Traps 3 const co = require('co'); const fs = require('fs'); const promisify = require('./promisify'); const readdir = promisify(fs.readdir); const stat = promisify(fs.stat); const getLastModified = (dir) => co(function* () { const files = yield readdir(dir); const stats = yield files.map((file) => stat(file)); const mtimes = yield stats.map((stat) => stat.mtime); return mtimes; }); getLastModified('.').then(results => { console.log(results); }); LGTM

Slide 49

Slide 49 text

generator/yield • ܁Γฦ͠ՄೳͳΦϒδΣΫτΛ࡞੒͢Δ generator ͱ܁Γฦ͠Λؔ਺ͷ్தͰࢭΊΔ yield ͷ૊Έ߹ΘͤͰඇಉظݺͼग़͠Ͱ΋ಉ ظͬΆ͘ॻ͚Δ • ※ͨͩ͠ɺcoͳͲͷwrapper͕ඞཁ

Slide 50

Slide 50 text

ଞʹ΋ศརͳػೳ͸৭ʑ͋Δ spread/rest Proxy/Reflect Symbols modules template string literals

Slide 51

Slide 51 text

ࠓ࢖͑Δͷʁʁʁ

Slide 52

Slide 52 text

Yes and No

Slide 53

Slide 53 text

Node.js v6 ͳΒ΄΅࢖͑Δ

Slide 54

Slide 54 text

Browser͸ IE ͱ͔ແࢹͯ͠Α͚ Ε͹࢖͑Δ

Slide 55

Slide 55 text

Ͱ΋ɾɾɾ • ϒϥ΢β͝ͱʹ࢖͑Δػೳ͕όϥόϥ • Node.js ΋όʔδϣϯʹΑͬͯ͸࢖͑ͳ͔ͬͨ Γ΋͢Δ • ಛʹ ES Modules ͸EdgeҎ֎ͩͱ࢖͑ͳ͍ • transpiler Λ࢖͏ͱIEͱ͔Ͱ΋ಈ͘Α͏ʹͳΔ

Slide 56

Slide 56 text

Transpiler

Slide 57

Slide 57 text

Transpiler • ES2015 Ͱॻ͍ͨΒม׵ͯ͠ݹ͍ϒϥ΢βͰ΋ ࢖͑ΔΑ͏ʹͯ͘͠ΕΔػೳ

Slide 58

Slide 58 text

transpiler Ͱ ES2015 ΍ͬͯ Έͨ͘ͳͬͨΒ

Slide 59

Slide 59 text

tower-of-babel

Slide 60

Slide 60 text

ESNext

Slide 61

Slide 61 text

ES2016 (ES7) ͰೖΔ͜ͱ͕ܾ ·ͬͯΔ΋ͷ • ES2016 • ΂͖৐ԋࢉࢠ 2 ** 3 • Array.prototype.include

Slide 62

Slide 62 text

ES2016 ͰೖΔ͜ͱ͕ܾ·ͬͯ Δ΋ͷ • ES2016 • ΂͖৐ԋࢉࢠ 2 ** 3 • Array.prototype.include ͑ͬͦΕ͚ͩʁʁʁ

Slide 63

Slide 63 text

ͳΜ͔৭ʑES2015͸ͨ͘͞Μ ػೳ͋ͬͨͷʹɾɾɾ • جຊతʹ ECMAScript ͸೥࣍Ͱߋ৽͞ΕΔΑ ͏ʹͳͬͨ • ͦͷஈ֊Ͱٞ࿦͕ऴΘͬͯ࢓༷ʹೖΔࣄ͕֬ ఆͨ͠ػೳ͕ͦͷ·· ECMAScript ͷ࣍ͷ೥ ࣍ʹ௥Ճ͞ΕΔɻ

Slide 64

Slide 64 text

feature based release • Web ͷਐԽ͸଎͍ • ES2015͸࢓༷ࡦఆ·ͰʹԿ೥΋͔͔͍ͬͯΔ • ਐԽʹద༻͢ΔͨΊʹ೥࣍Ͱߋ৽ • ػೳϕʔεͰܾ·͍ͬͯ͘

Slide 65

Slide 65 text

ESNextظ଴ageͷػೳୡ

Slide 66

Slide 66 text

async-await

Slide 67

Slide 67 text

JavaScript Traps 3 const co = require('co'); const fs = require('fs'); const promisify = require('./promisify'); const readdir = promisify(fs.readdir); const stat = promisify(fs.stat); const getLastModified = (dir) => co(function* () { const files = yield readdir(dir); const stats = yield files.map((file) => stat(file)); const mtimes = yield stats.map((stat) => stat.mtime); return mtimes; }); getLastModified('.').then(results => { console.log(results); });

Slide 68

Slide 68 text

JavaScript Traps 3 const co = require('co'); const fs = require('fs'); const promisify = require('./promisify'); const readdir = promisify(fs.readdir); const stat = promisify(fs.stat); const getLastModified = (dir) => co(function* () { const files = yield readdir(dir); const stats = yield files.map((file) => stat(file)); const mtimes = yield stats.map((stat) => stat.mtime); return mtimes; }); getLastModified('.').then(results => { console.log(results); }); ·ͩͪΐͬͱඍົ ओʹ͜ͷล

Slide 69

Slide 69 text

JavaScript Traps 3 const fs = require('fs'); const promisify = require('./promisify'); const readdir = promisify(fs.readdir); const stat = promisify(fs.stat); const getLastModified = (dir) => async function () { const files = await readdir(dir); const stats = await files.map((file) => stat(file)); const mtimes = await stats.map((stat) => stat.mtime); return mtimes; }); getLastModified('.').then(results => { console.log(results); });

Slide 70

Slide 70 text

JavaScript Traps 3 const fs = require('fs'); const promisify = require('./promisify'); const readdir = promisify(fs.readdir); const stat = promisify(fs.stat); const getLastModified = (dir) => async function () { const files = await readdir(dir); const stats = await files.map((file) => stat(file)); const mtimes = await stats.map((stat) => stat.mtime); return mtimes; }); getLastModified('.').then(results => { console.log(results); }); LVGTM

Slide 71

Slide 71 text

async-await • generator/yield Ͱ΍Δͷ͸एׯϋοΩʔ • generator/yield ͸܁Γฦ͠ՄೳͳΦϒδΣΫτͷੜ ੒ͱૢ࡞ʹಛԽͤͯ͞ɺඇಉظॲཧ͸ઐ༻ͷߏจΛ༻ ҙ͢Δ • async-await Ͱॻ͘ͱ*/yield ΑΓ͸ݟ௨͕͠ྑ͍ • དྷ೥ͷ ES2017 Ͱ͸ೖΔՄೳੑ͕ߴ͍

Slide 72

Slide 72 text

SIMD

Slide 73

Slide 73 text

SIMD const a = [1.0, 2.0, 3.0, 4.0]; const b = [5.0, 6.0, 7.0, 8.0]; const c = []; for(var i=0; i

Slide 74

Slide 74 text

SIMD var a = SIMD.float32x4(1.0, 2.0, 3.0, 4.0); var b = SIMD.float32x4(5.0, 6.0, 7.0, 8.0); var c = SIMD.float32x4.add(a,b); console.log(c); // 6, 8, 10, 12 • Faster!

Slide 75

Slide 75 text

SIMD • JavaScript ͰϕΫτϧܭࢉΛ؆୯͔ͭߴ଎ʹ ߦΘͤΔΑ͏ʹ͢ΔͨΊͷ΋ͷ • Ԡ༻ྫɿػցֶशɺը૾ॲཧɺ෺ཧԋࢉɺ3D άϥϑΟοΫε etc • ES2017 ͰೖΔ͔΋ɾɾɾ

Slide 76

Slide 76 text

class props declarations

Slide 77

Slide 77 text

ES2015 class ͷදݱྗ͸௿͍ class Alice { constructor() { this.name = 'Alice' } printNameTick() { console.log(this.name); // Alice setInterval(() => { console.log(this.name); // Alice }, 1000); } } var alice = new Alice(); alice.printNameTick(); member field ͸ constructor ʹهड़ ͠ͳ͍ͱ͍͚ͳ͍

Slide 78

Slide 78 text

class props declarations class Alice { name = 'Alice'; // member field static foo = 'foo'; // static ͳfield΋ఆٛͰ͖Δ printNameTick() { console.log(this.name); // Alice setInterval(() => { console.log(this.name); // Alice }, 1000); } } var alice = new Alice(); alice.printNameTick();

Slide 79

Slide 79 text

class props declarations class Alice { name = 'Alice'; // member field static foo = 'foo'; // static ͳfield΋ఆٛͰ͖Δ printNameTick() { console.log(this.name); // Alice setInterval(() => { console.log(this.name); // Alice }, 1000); } } var alice = new Alice(); alice.printNameTick(); LVGTM

Slide 80

Slide 80 text

class props declarations • class Ͱ௚઀member/static member Λॻ͚Δ Α͏ʹ͠Α͏ͱ͍͏΋ͷɻ • ಛʹ static member ͸ React ͱ͔Ͱ΋Α͘ར ༻͢ΔͷͰॻ͚Δͱخ͍͠ɻ • ͍ͭೖΔ͔͸ෆ໌ɺೖΒͳ͍Մೳੑ΋͋Δɻ

Slide 81

Slide 81 text

͍ͭͰʹ֮͑Α͏ private field

Slide 82

Slide 82 text

private member field class Alice { #name = 'Alice'; // private member field printNameTick() { console.log(this.#name); // Alice setInterval(() => { console.log(this.#name); // Alice }, 1000); } } var alice = new Alice(); alice.printNameTick(); ‧‪‬‭⛺è('ω')è⛺䡡‬‪‧

Slide 83

Slide 83 text

private member field • classʹ private memberΛॻ͚ΔΑ͏ʹ͠Α͏ • #foo ͱ͔Ͱఆٛ • ͍ͭೖΔ͔͸ෆ໌ɺೖΒͳ͍Մೳੑ΋͋Δɻ

Slide 84

Slide 84 text

͍ͭͰʹ֮͑Α͏ Decorator

Slide 85

Slide 85 text

Decorator class Alice { #firstname = 'Alice'; // private member field #lastname = 'Bob'; // private member field @readonly // decorator fullname() { return `${this.#firstname} ${this.#lastname}` } } var alice = new Alice(); console.log(alice.fullname()); alice.fullname = function someMock(){}; // error

Slide 86

Slide 86 text

Decorator • class/function/member ʹରͯͦ͠ΕΛ೚ҙͷ ػೳͰम০(decorate)ͤ͞Δ • @readonlyͱ͔@nonenumerableͱ͔ @overrideͱ͔෇͚ΒΕΔ • ͍ͭೖΔ͔͸ෆ໌ɺͨͩɺ࢓༷ࡦఆऀ͸΍Δؾ

Slide 87

Slide 87 text

·ͩ·ͩଞʹ΋ظ଴͢Δͷ͸ ͋Δ SharedArrayBuffer Observable bind operator etc

Slide 88

Slide 88 text

·ͱΊ

Slide 89

Slide 89 text

·ͱΊ • JavaScript ͸ͲΜͲΜਐԽ͍ͯ͠Δ • ಛʹES2015Ͱ͔ͳΓਐԽ͠ɺ᠘͸ݮͬͨ • ࠓޙ΋ਐԽͷ଎౓Λ଎Ί͍ͯΔ • ಛʹ։ൃऀͱ࢓༷ࡦఆऀͷ͕ؒॖ·͖ͬͯͨ • JavaScript Λࠓޙྑ͍ͯ͘͘͠ͷ͸๻Β

Slide 90

Slide 90 text

͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ ͔͝͠·࠷ߴ