おはようございます。KMC3回生の id:tyage です。
前回に引き続き6/23にECMAScript6勉強会 第4回を行いました。
第4回
第4回では Block-level function declaration, Object.assign, Map, WeakMap, let を読みました。
Block-level function declaration
use strict している場合、関数宣言がblock scopeになる用に仕様が変更されたようです。
"use strict" { function a() {} } typeof a === "undefined" // => true
Object.assign
Object.assignは、第一引数で受け取ったオブジェクトを、第二引数以降で受け取ったオブジェクトのプロパティで上書きするメソッドのようです。
var a = { zero: 0, prime: 1 } var b = { nonprime: 2, prime: 3 } var c = { nonprime: 4, prime: 5, nonnonprime: 6 } var d = Object.assign(a, b, c); a === d // => true a // => { prime: 5, nonprime: 4, nonnonprime: 6, zero: 0 }
引数でパラメータとしてオブジェクトを受け取り、デフォルトのパラメータのオブジェクトに適用する場合など、便利だと思います。
Map
Mapは1つのオブジェクトやプリミティブ値をkeyにして、値を紐付けることができる仕組みです。
var map = new Map() var key = { something: 1 } // var map = new Map([[ key, 123 ]]) でも可 map.set(key, 123) map.get(key) // => 123
set, getの他にhas, keys, values, forEach, entries, clearなどのメソッドが用意されています。
また、iterableなのでfor..of構文も適用することができます
WeakMap
WeakMapは、Mapと同様にkeyとなるオブジェクトと値を紐付け、set・getが可能な仕組みになっています。
ただし、keyとなるオブジェクトに対してweak referenceが保持されるため、WeakMap以外でkeyとなるオブジェクトへの参照がなくなった場合、keyがGC対象となります。
そのためWeakMapのkeyはオブジェクトである必要があり、またforEachやvaluesなどのenumerateするようなメソッドは用意されていません。
使用できるメソッドはget, set, has, delete, clearのようです。
例えば以下の様なコードの場合、keyとなる {a:1} はWeakMap内部以外から参照されていないためGC対象になると思われます。【要検証】
var map = new WeakMap() map.set({a:1}, 123)
let
letはECMAScript6の新機能の中でも目玉と思われるsyntaxで、これによりblock scopeでローカル変数宣言を行うことが可能となりました。
"use strict" var a = 2 { let a = 1 a // => 1 } a // => 2
forやswitch-case内でのletの扱いについてはいくつか議論があったようですが、例えばforに関しては現在は以下の挙動で落ち着いているようです。
"use strict" let arr = [] for (let x = 0; x < 10; x++) { arr.push(function() { return x; }) } arr[0]() // => 10 (not 0)
話がそれますが、仕様では"let and const declaration"となっており、const宣言もblock scopeのように見えるのですが、ブラウザによって実装が異なるようで、例えばfirefox(32.0a2)とchrome(35.0.1916.153)では以下の点で挙動が違うようでした。(この場合、firefoxの実装が間違っているのでしょうか)
"use strict" { const a = 1 } typeof a // => "undefined" (chrome), "number" (firefox)
次回(第5回)は6/30です。