KMC活動ブログ

京大マイコンクラブの活動の様子を紹介します!!

ECMAScript6勉強会 第15回

第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についてやりました。

お楽しみに。