ブックマーク / js-next.hatenablog.com (24)

  • Function#nameについて - JS.next

    概要 ES2015からは名前の無い関数定義であっても、コンテキストによって関数のnameプロパティが定義されるようになった。 nameプロパティが定義される例 直接的な変数への代入 f1 = function () {} var f2 = function () {} let f3 = () => {} const f4 = () => {} console.log( f1.name, f2.name, f3.name, f4.name ) // "f1" "f2" "f3" "f4" 直接的なプロパティ定義 o = { m1: function () {}, ['m2']: () => {}, m3() {} } console.log( o.m1.name, o.m2.name, o.m3.name ) // "m1" "m2" "m3" nameプロパティが定義されない例 間接的なケ

    Function#nameについて - JS.next
    kkeisuke
    kkeisuke 2016/04/21
  • 末尾呼び出し最適化が実装された - JS.next

    概要 ある関数Aから別の関数Bを呼び出すとき、処理系は後で戻って来れるように一旦Aの状態を保存し、関数Bの処理に入る。 これが問題になるのは再帰の時で、数万回程度の再帰でスタックが一杯になり、エラーとなってしまう。 しかし、もし関数B呼び出しの際に、関数Aに戻ってきて処理を続ける必要のない形で呼びだされていれば、 状態の保存を省略して関数Bに移行する最適化が可能であり、ES2015でその詳細が定義されることとなった。 例 具体的には、strictモードの関数で、「 return fn() 」という形での呼び出しについて最適化が有効になる。 最適化が効く例: function fn( n ) { 'use strict' if ( n <= 0 ) { return 'done!' } return fn( n - 1 ) // この関数がする処理はこれ以上ない } fn( 1e6 ) //

    末尾呼び出し最適化が実装された - JS.next
    kkeisuke
    kkeisuke 2016/02/03
  • Object.{values,entries}が実装された - JS.next

    概要 オブジェクトの全ての列挙可能なプロパティの文字列キーの配列を返すObject.keys関数に似た、 値の配列を返すObject.valuesと、キーと値のペアの配列を返すObject.entries関数が実装された。 例 let obj = { a: 1, b: 2, c: 3 } console.log( Object.keys( obj ) ) // [ "a", "b", "c" ] console.log( Object.values( obj ) ) // [ 1, 2, 3 ] console.log( Object.entries( obj ) ) // [ ["a", 1], ["b", 2], ["c", 3] ] 実装されるバージョン V8 4.10.36

    Object.{values,entries}が実装された - JS.next
    kkeisuke
    kkeisuke 2016/01/27
  • @@speciesが実装された - JS.next

    概要 クラスの種族を設定するためのビルトインシンボルが実装された。 解説 例えば、ArrayのサブクラスであるMyArrayを定義し、そのインスタンスmyaryを作ったとき、 myary.map()はArrayではなくMyArrayのインスタンスを返して欲しいと通常思うだろう。 そうしたケースに応えるため、幾つかのビルトインメソッドはconstructorの@@speciesプロパティを見ることで インスタンスの種族コンストラクタを知り、それを使うようになっている。 とは言え、ビルトインコンストラクタに定義されている@@speciesゲッタはサブクラスを返す挙動をするため、 殆どの場合ではわざわざ自前サブクラスに@@speciesを定義しないで、スーパークラス側のそれを使わせればよい。 もしmyary.map()の結果がMyArrayではないものであって欲しいと思う場合には、定義することで

    @@speciesが実装された - JS.next
    kkeisuke
    kkeisuke 2016/01/27
  • 正規表現の後読みが実装された - JS.next

    概要 後読みは「何かが直前に来る目標」を指す際に便利な表現である。 解説 先読み「(?=pattern)」 がpatternの直前の位置にマッチするのに対して、 後読み「(?<=pattern)」はpatternの直後の位置にマッチする。 どちらもpattern自体にはマッチしない。 先読みが「何かが続く目標」を指すのに向いているのに対して、 後読みは「何かに続く目標」を指すのに向いている。 例 基: // 肯定的後読み:lightかdeepに続く色を取り出す let str1 = 'red, deep green, light blue, white' str1.match(/(?<=(?:[light|deep] ))\w+/g) // ["green", "blue"] // 否定的後読み:200X年を除いて項目を取り出す let str2 = '1997:ES1\n1998:ES

    正規表現の後読みが実装された - JS.next
    kkeisuke
    kkeisuke 2015/11/21
  • do式が実装された - JS.next

    概要 ブロック文のようでありながら、かつ中に書かれた最後の式の評価を返すdo式が実装された。 基 let foo = do { // ブロックスコープを作る let x = 1 + 1 // 中に文(や式)を記述できる x + 3 // 最後に評価された式がdo式の結果となる function fn(){} // 文は評価されない } console.log(foo) // 5 但しfor文やwhile文などは少し注意が必要で、 まず初期化部、条件部、更新部の評価はdo式が返す値にならない。 let bar = do { for (let i = 1; i <= 10; i++) i } // 実際の最後の式評価は (11 <= 10) => false console.log(bar) // 10 そして処理部に何も書かれていない場合でも、undefinedと評価される。 let ba

    do式が実装された - JS.next
    kkeisuke
    kkeisuke 2015/10/24
  • SIMD型について - JS.next

    概要 新しいプリミティブ型であるSIMD型及びAPIがV8で実装されてきている。 SIMDとは、複数の数値を並べて1つの値としたようなデータ型である。 これはCPUによって効率良くサポートされているデータ型であり、 1 + 2 -> 3 をするように [ 1, 2, 3, 4 ] + [ 2, 3, 4, 5 ] -> [ 3, 5, 7, 9 ] を1回の演算ですることができる。 つまり、沢山の数値を扱う場面でSIMD型を利用することで、何倍ものパフォーマンス向上が期待できる。 (※WASMに入ることとなり、ESからは一旦取り除かれました。) 実装される型 float32x4 32bit浮動小数点型を4つ並べた128bitのデータ型 float32はJSの通常のnumberであるところのfloat64より精度が低い int32x4 32bit符号付き整数型を4つ並べた128bitのデータ

    SIMD型について - JS.next
    kkeisuke
    kkeisuke 2015/07/22
  • Spread要素が実装された - JS.next

    概要 配列リテラルでSpread要素を使うと、イテラブルとして展開してそれぞれを要素にしてくれる。 例 var a = [3, 4, 5] var b = [1, 2, ...a, 6, 7] // [1, 2, 3, 4, 5, 6, 7] 応用 文字列を配列にする str.slice() ↓ [...str] (但し後者はサロゲートペアも考慮される) 重複を取り除いた配列を得る ary.filter( (v, i) => ary.indexOf(v) == i ) ↓ [...new Set(ary)] 0からn-1までの要素を持つ配列を作る [...Array(n).keys()] 実装されるバージョン V8 4.5.11 4.5.69(デフォルト有効)

    Spread要素が実装された - JS.next
    kkeisuke
    kkeisuke 2015/06/24
  • Object.assignが実装された - JS.next

    概要 Object.assignはオブジェクト同士をマージするJSerの誰もが長年追い求めた夢のメソッドである。 使い方 Object.assign( target, ...sources ) 第一引数で渡したオブジェクトに、第二引数以降のオブジェクトが直接持つ、 全ての列挙可能なStringまたはSymbolプロパティを加え、結果として返す。 例: var sym = Symbol() var obj1 = { "str": 1, } var obj2 = { "str": 2, [sym]: 2 } var obj3 = Object.assign( obj1, obj2 ) console.log( obj1 == obj3 ) // true console.log( obj1["str"] == 2 ) // true console.log( obj1[ sym ] == 2

    Object.assignが実装された - JS.next
    kkeisuke
    kkeisuke 2015/05/09
    “Object.assignはオブジェクト同士をマージする”
  • new.targetメタプロパティについて - JS.next

    概要 「new.target」とは、ES2015で導入されたビルトインクラスのサブクラスを作る上で欠かせない存在である[[newTarget]]を取得するためのメタプロパティである。 従来の問題点 ES5まではArrayのようなビルトインクラスを適切に継承したサブクラスを作ることができなかった。 ES2015からのプロトタイプ設定機能を使うと可能であり、このようになる。 class Stack extends Array { constructor( ...args ) { var stack = new Array( ...args ) return Object.setPrototypeOf( stack, Stack.prototype ) } clear() { this.length = 0 } } しかし毎回このように書かないといけないのはスマートではない。 できればこの様に書

    new.targetメタプロパティについて - JS.next
    kkeisuke
    kkeisuke 2015/03/25
  • ユニコードエスケープシーケンスが拡張された - JS.next

    概要 今まではサロゲートペアによる文字を1シーケンスで表すことが出来なかったが、ES2015では『\u{xxxxx}』の形式で「0xffff」を超える文字コードを表すことができる。 例 var s1 = '\ud842\udf9f' var s2 = '\u{20b9f}' console.log( s1 == s2, s1, s2 ) // true "𠮟" "𠮟" 実装されるバージョン V8 3.31.38(文字列リテラル内) 4.2.1(正規表現リテラル内)

    ユニコードエスケープシーケンスが拡張された - JS.next
    kkeisuke
    kkeisuke 2014/12/06
  • テンプレートリテラルが実装された - JS.next

    概要 テンプレート文字列を記述できる構文が実装された。 テンプレートリテラル 基の使い方 バッククオート『 ` 』で囲んだ文字が、文字列リテラル同様に文字列として評価される。 var t = `テンプレート` var s = "テンプレート" console.log(t) // "テンプレート" console.log(t == s) // true 改行がそのまま認識される。 var t = `テンプ レート` var s = "テンプ\n"+ "レート" console.log(t) // "テンプ⏎レート\t" console.log(t == s) // true 文字列中に変数などを埋め込む リテラル中の『${』と『}』で囲まれた部分は式として評価される。 var n = 123, f = () => 339 var t = `0${ n }45${ f() * 2 }9` v

    テンプレートリテラルが実装された - JS.next
    kkeisuke
    kkeisuke 2014/11/23
  • superキーワードについて - JS.next

    概要 長らく予約語であったsuperキーワードが、継承元の関数を呼ぶためのキーワードとして機能するようになった。 2種類の使い方 superキーワードは場所によって2種類の使い方があり、それぞれ違う振る舞いをする。 1つ目はコンストラクタ内で使う場合、2つ目はメソッド内で使う場合である。 コンストラクタ内で使う場合 ここでいうコンストラクタとは、Class構文中のconstructorメソッドのことである。 この場合、「super()」や「new super」などとすることにより、その関数のプロトタイプである関数を呼ぶことができる。 そして、 呼び出し先が返した値が以後呼び出し元のthisとして使われる。 つまり、Animalコンストラクタを継承したCatコンストラクタを定義したい以下の例だと、 function Animal( name ) { this.name = name } fu

    superキーワードについて - JS.next
    kkeisuke
    kkeisuke 2014/11/03
  • Class構文について - JS.next

    概要 待ち焦がれた人も多いことだろう。ES2015の一番の目玉機能とも言えるクラス構文が、ついにV8でサポートされた。 Class構文は、『関数(コンストラクタ)定義』+『.prototypeへのメソッド定義』の糖衣構文である。 JSで今まで様々に工夫されてきたクラスの書き方を、綺麗に統一してくれる可能性を秘めている。 クラスを作る 従来、Catクラスを作ろうとした場合このように書いてきた。 function Cat(name) { this.name = name } Cat.prototype.meow = function () { alert( this.name + 'はミャオと鳴きました' ) } しかしこの書き方だとどうしても、コンストラクタとメソッドの定義が分離されているため、クラスとしてまとまりがなく分かりづらく感じる。 メソッドが増えてきた時も、Cat.prototyp

    Class構文について - JS.next
    kkeisuke
    kkeisuke 2014/11/01
  • @@toStringTagが実装された - JS.next

    概要 例えば『Object.prototype.toString.call([])』と呼ぶと、『"[object Array]"』と帰ってくるが、 その「Array」の部分をどういう表記にするか設定できるビルトインシンボルが実装された。 例 function Cat() { } var cat = new Cat console.log( '' + cat ) // "[object Object]" Cat.prototype[Symbol.toStringTag] = 'Cat' console.log( '' + cat ) // "[object Cat]" 一部のビルドインコンストラクタには@@toStringTagが定義されている。 console.log( Map.prototype[Symbol.toStringTag] ) // "Map" 実装されるバージョン V8 3

    @@toStringTagが実装された - JS.next
    kkeisuke
    kkeisuke 2014/10/24
  • プロパティの短縮定義記法が実装された - JS.next

    概要 オブジェクトリテラルが拡張されてプロパティを短く定義できるようになった。 例 これが、 var x = 1, y = 2, z = 3 var obj = { x: x, y: y, z: z } こう書ける。 var x = 1, y = 2, z = 3 var obj = { x, y, z } 実装されるバージョン V8 3.30.1

    プロパティの短縮定義記法が実装された - JS.next
    kkeisuke
    kkeisuke 2014/10/02
  • ジェネレータについて - JS.next

    概要 V8でジェネレータ周りの実装が進んできたので、解説してみようと思う。 ジェネレータ関数 ジェネレータ関数とは、(一つの見かたとしては)処理を途中で一時停止できる関数のことである。 例えば、呼び出される度に数を順番に返す関数を定義したいとする。 function count(n) { return function () { return n++ } } var next = count(10) next() // 10 next() // 11 next() // 12 これがジェネレータ関数を用いると次のように書ける。 function* count(n) { while (true) { yield n++ } } var gen = count(10) gen.next() // { value: 10, done: false } gen.next() // { value:

    ジェネレータについて - JS.next
    kkeisuke
    kkeisuke 2014/08/16
  • @@unscopablesが実装された - JS.next

    概要 with文に与えたオブジェクトの特定のプロパティがスコープに含まれることを防ぐための、 ビルトイン"unscopables"シンボルが実装された。 例 @@unscopablesプロパティのオブジェクトが有する名前のプロパティは、値がTruthyならスコープから外される。 var a = 'unscopable', b = 'unscopable', c = 'unscopable' var obj = { a: 'scopable', b: 'scopable', c: 'scopable', } obj[Symbol.unscopables] = { b: true, c: false } with (obj) { console.log(a, b, c) } /* log "scopable" "unscopable" "scopable" */ 何故必要なのか ES2015で

    @@unscopablesが実装された - JS.next
    kkeisuke
    kkeisuke 2014/08/12
  • アロー関数が実装された - JS.next

    概要 ES2015を象徴する機能である、アロー関数構文の実装がついにV8で始まった。 無名関数を短く書ける   [3.28.31] アロー関数は無名関数の省略記法である。 今までこう書いていたのが、 var fn = function (a, b) { } こうスッキリ書ける。 var fn = (a, b) => { } 「=>」が矢のように見えることから「アロー」関数と言う。 更に短くできる これが、 [1, 2, 3].map( function (v) { return v * v } ) // [1, 4, 9] アロー関数だとこうなるが、 [1, 2, 3].map( (v) => { return v * v } ) // [1, 4, 9] 引数が一つの時には「()」を省略できるので、こう書ける。 [1, 2, 3].map( v => { return v * v } )

    アロー関数が実装された - JS.next
    kkeisuke
    kkeisuke 2014/07/23
  • イテレータについて - JS.next

    概要 V8でES2015のイテレーション周りの実装が進んできたので、解説してみようと思う。 イテレーションとは ここではデータの要素を繰り返して取り出すこと。 例えば配列のforEachメソッドは、要素やインデックスをイテレートするイテレータである。 ただしこれらは(内部的に)繰り返しまで行うイテレータ(内部イテレータ)だが、ES2015では外部イテレーションのための仕組みが入った。 イテレータオブジェクト イテレータオブジェクトは『次の要素』を返すメソッドを備えているオブジェクトである。 つまりイテレーションの『次の要素を取り出す』ことだけを担い、それを繰り返すことは外で行われる(外部イテレータ)。 例 Array.prototype.values()は配列の要素を順番に列挙するイテレータオブジェクトを返す。 var ary = [5, 4, 3] var iter = ary.valu

    イテレータについて - JS.next
    kkeisuke
    kkeisuke 2014/06/25