第15回
11/17に第15回を行いました。
この回では Unicode code point escapes, Global symbol registry, well-known symbols を読みました。
Unicode code point escapes
この新しく入った表現により、従来のunicode code unitごとの形式ではなく、code pointごとの形式で記述することができるようになりました。
例として、 "𠮷"
をcode unitの形式で "\uD842\uDFB7"
とかけましたが、code pointの形式で "\u{20BB7}"
と表記できるようになりました。
code point1文字でunicodeに登録されている文字を表現できるので、この方が綺麗にかけるかと思います。
Global symbol registry
global環境でsymbolを登録、検索することができます
fooSym = Symbol.for('foo') console.log(Symbol.keyFor(fooSym)) // => foo
well-known symbols
Symbol.hasInstance
instanceOf構文で、このプロパティの関数が呼び出されます。
let foo = function() {} foo[Symbol.hasInstance] = (v) => v === 1 console.log(1 instanceof foo) // => true console.log(2 instanceof foo) // => false
Symbol.isConcatSpreadable
オブジェクトがArray.prototype.concatに渡される際に、1つの要素として追加されるか、各要素を末尾につけるかどうかの分岐に使われます。
真偽値が入るシンボルプロパティとなります。
let a = [1, 2, 3], b = [4, 5, 6] b[Symbol.isConcatSpreadable] = true console.log(a.concat(b)) // => [ 1, 2, 3, 4, 5, 6 ] b[Symbol.isConcatSpreadable] = false console.log(a.concat(b)) // => [ 1, 2, 3, [4, 5, 6] ]
Symbol.isRegExp
独自の正規表現を作るのに使えそうという感じでしたが、12/6のRev29で削除されました。
Symbol.iterator
このシンボルプロパティではiterator interfaceに従うobjectを返す関数が実装されます。
a = 0 let c = { [Symbol.iterator]: () => { return { next: () => { return { done: ++a === 2, value: "foo" } } } } } for (let d of c) { console.log(d) // => foo }
Symbol.toPrimitive
オブジェクトのこのシンボルプロパティは、オブジェクトがプリミティブ値として評価される際に呼ばれます。
引数としてhintが渡され、どの型のプリミティブ値に変換するかの判断基準となります。(hintは"string"
, "number"
, "default"
のいづれかの値になります)
ECMAScriptオブジェクトの他のオブジェクトは"default"
が渡された場合"number"
と同じ振る舞いをするのに対し、Dateオブジェクトのみが唯一"default"
の際に"string"
と同じものを返します。
let e = { [Symbol.toPrimitive]: (hint) => 334 } console.log(e == 334) // => true console.log(e == 333) // => false
Symbol.toStringTag
Object.prototype.toString内で"[object tag]"
といった文字列の生成時に使用されます。
let f = { } console.log(f + "") // => "[object foo]" console.log(Math + "") // => "[object Math]"
Symbol.unscopables
これに関しては、前回の記事のArray.prototype[Symbol.unscopables]の章に書いてあります。
ECMAScript6勉強会 第14回 【KMCアドベントカレンダー15日目】 - KMC活動ブログ
次回
次回は11/27(木)でした。
classとsuperについてやりました。
お楽しみに。