Share
Embed
Transcript
90 slides
-
JavaScript Traps 1 var test = 'global'; function foo() {
console.log(test); // global?? local?? if (true) { var test = 'local'; console.log(test); // global?? local?? } } foo(); -
JavaScript Traps 1 var test = 'global'; function foo() {
console.log(test); // undefined if (true) { var test = 'local'; console.log(test); // local } } foo(); -
JavaScript Traps 1 var test = 'global'; function foo() {
var test; console.log(test); // undefined if (true) { test = 'local'; console.log(test); // local } } foo(); ࣮ࡍͷ&OHJOFͷ ղऍ͜͏ͳΔ -
JavaScript Traps 1 var test = 'global'; function foo() {
console.log(test); // global?? local?? if (true) { var test = 'local'; console.log(test); // global?? local?? } } foo(); ר্͖͛ࣄނ -
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(); -
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(); -
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 => ????? (browserwindow, node Timer }, 1000); }; var alice = new Alice(); alice.printNameTick(); UIJT͕ࢦ͍ͯ͠Δͷ͕ มΘΔ -
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 -
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); }); -
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 -
ES2015ʁ • JavaScript ͷ৽͍͠ *ن֨* • ਖ਼໊ࣜশ ECMA-262 • ௨শ
ECMAScript • ECMA International ஂମ͕ఆٛ • ͋͘·Ͱن֨Ͱ࣮͋ͬͯͰͳ͍ -
ES6? ES7? • ECMA-262(௨শ ECMAScript) 6th Edition ͳ ͷͰ ES6
• ࠓ ES7 • ͨͩ͏͜ͷݺশͦΜͳසൟʹΘͳ͍ • ৄ͘͠ޙͰઆ໌͢Δ -
JavaScript Traps 1 var test = 'global'; function foo() {
console.log(test); // global?? local?? if (true) { var test = 'local'; console.log(test); // global?? local?? } } foo(); ר্͖͛ࣄނ -
JavaScript Traps 1 const test = 'global'; function foo() {
console.log(test); // global if (true) { const test = 'local'; console.log(test); // local } } foo(); -
JavaScript Traps 1 const test = 'global'; function foo() {
console.log(test); // global if (true) { const test = 'local'; console.log(test); // local } } foo(); LGTM -
let ͱ const • block scope ͱݴͬͯมείʔϓ͕ϒϨʔε{}ͷதʹ ด͡Δ • let
࠶ೖՄೳͳม • const ࠶ೖෆՄೳͳม • جຊతʹ const Λͬͯ let ೖՄೳͳͷʹͷ Έ͏ͷ͕ίʔυϚφʔʹͳΓͭͭ͋Δ -
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 -
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(); -
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 -
arrow function • Ξϩʔؔͱݴͬͯ this ͕Ξϩʔؔʹଋ റ͞ΕΔ • ؔͷதͰthisΛ͏࣌ʹ͍͍ͪͪbind͢Δඞ ཁ͕ͳ͍ɻ
// ͜͏͍͏࣌ʹ͏ɻ [1,2,3,4,5,6,7,8,9].filter(n => n % 2 === 0).reduce(prev, curr => prev + curr); -
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 -
class • JavaScript Ͱ class Λ࡞ΕΔΑ͏ʹͳͬͨ • ͜Ε·Ͱͷ prototype ͷԆ
• ܧঝͱ͔Մೳ class Alice extends Person { } -
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 -
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); }); -
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 -
Promise • ඇಉظॲཧͷݺͼग़͠ΛநԽͨ͠ͷ • then Ͱޭ࣌ͷݺͼग़͠ɺ catch Ͱࣦഊ࣌ͷྫ֎͕औ ಘͰ͖Δ •
then Ͱܨ͙͜ͱͰ callback hell Λճආ͢Δ • ※NodeͷAPI·ͩPromiseʹͳͬͯͳ͍ͷͰผ్ PromiseԽ͢Δॲཧ(Promisify) ͕ඞཁ -
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 -
Ͱɾɾɾ • ϒϥβ͝ͱʹ͑Δػೳ͕όϥόϥ • Node.js όʔδϣϯʹΑͬͯ͑ͳ͔ͬͨ Γ͢Δ • ಛʹ ES
Modules EdgeҎ֎ͩͱ͑ͳ͍ • transpiler Λ͏ͱIEͱ͔Ͱಈ͘Α͏ʹͳΔ -
ES2016 (ES7) ͰೖΔ͜ͱ͕ܾ ·ͬͯΔͷ • ES2016 • ͖ԋࢉࢠ 2 **
3 • Array.prototype.include -
ES2016 ͰೖΔ͜ͱ͕ܾ·ͬͯ Δͷ • ES2016 • ͖ԋࢉࢠ 2 ** 3
• Array.prototype.include ͑ͬͦΕ͚ͩʁʁʁ -
ͳΜ͔৭ʑES2015ͨ͘͞Μ ػೳ͋ͬͨͷʹɾɾɾ • جຊతʹ ECMAScript ࣍Ͱߋ৽͞ΕΔΑ ͏ʹͳͬͨ • ͦͷஈ֊Ͱ͕ٞऴΘ༷ͬͯʹೖΔࣄ͕֬ ఆͨ͠ػೳ͕ͦͷ··
ECMAScript ͷ࣍ͷ ࣍ʹՃ͞ΕΔɻ -
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); }); -
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); }); ·ͩͪΐͬͱඍົ ओʹ͜ͷล -
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); }); -
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 -
async-await • generator/yield ͰΔͷएׯϋοΩʔ • generator/yield ܁Γฦ͠ՄೳͳΦϒδΣΫτͷੜ ͱૢ࡞ʹಛԽͤͯ͞ɺඇಉظॲཧઐ༻ͷߏจΛ༻ ҙ͢Δ •
async-await Ͱॻ͘ͱ*/yield ΑΓݟ௨͕͠ྑ͍ • དྷͷ ES2017 ͰೖΔՄೳੑ͕ߴ͍ -
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<a.length; i++) { c[i] = a[i] + b[i]; } console.log(c); // 6, 8, 10, 12 • -
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! -
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 ʹهड़ ͠ͳ͍ͱ͍͚ͳ͍ -
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(); -
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 -
class props declarations • class Ͱmember/static member Λॻ͚Δ Α͏ʹ͠Α͏ͱ͍͏ͷɻ •
ಛʹ static member React ͱ͔ͰΑ͘ར ༻͢ΔͷͰॻ͚Δͱخ͍͠ɻ • ͍ͭೖΔ͔ෆ໌ɺೖΒͳ͍Մೳੑ͋Δɻ -
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(); ‧⛺è('ω')è⛺䡡‧ -
private member field • classʹ private memberΛॻ͚ΔΑ͏ʹ͠Α͏ • #foo ͱ͔Ͱఆٛ
• ͍ͭೖΔ͔ෆ໌ɺೖΒͳ͍Մೳੑ͋Δɻ -
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 -
·ͱΊ • JavaScript ͲΜͲΜਐԽ͍ͯ͠Δ • ಛʹES2015Ͱ͔ͳΓਐԽ͠ɺ᠘ݮͬͨ • ࠓޙਐԽͷΛΊ͍ͯΔ • ಛʹ։ൃऀͱ༷ࡦఆऀͷ͕ؒॖ·͖ͬͯͨ
• JavaScript Λࠓޙྑ͍ͯ͘͘͠ͷΒ