タグ

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

  • Object.getOwnPropertyDescriptorsが実装された - JS.next

    概要 対象のオブジェクトがもつ全てのPropertyDescriptorsを得られる関数が実装された。 例 以下の時 obj = { name: 42, [ Symbol( 'foo' ) ]: 56 } これまでは Object.getOwnPropertyDescriptor( obj, 'name' ) のように1つずつしか得られなかったが これからはgetOwnPropertyDescriptorsの方を呼ぶことで Object.getOwnPropertyDescriptors( obj ) // -> { name1: { value: 42, writable: true, enumerable: true, configurable: true }, Symbol( foo ): { value: 56, writable: true, enumerable: true,

    Object.getOwnPropertyDescriptorsが実装された - JS.next
  • async関数が実装された - JS.next

    概要 非同期な処理を同期的に書ける関数タイプが実装された。 基 「async」キーワードに続けて関数定義を書くと、async関数となる。 async function afn1() { } afn2 = async () => { } obj = { async afn3() { } } async関数を呼び出すとプロミスが返される。 console.log( afn1() ) // <Promise> このプロミスは、async関数が終了するとその返り値で解決され、例外が起こると棄却される。 async function afn4( flag ) { if ( flag ) return 'Yes' else throw 'No' } afn4( true ).then( v => console.log( v ) ) /// "Yes" afn4( false ).catch( v

    async関数が実装された - JS.next
    yosuke_furukawa
    yosuke_furukawa 2016/05/19
    めでたい
  • 明示的な末尾呼び出し最適化構文が実装された - JS.next

    概要 ES2015で特定の形で関数呼び出しがされている場合に末尾呼び出し最適化が行われるよう定められたが、 パフォーマンスや、デバッグなどの実装上の問題が浮上したため、それを解決するための新たな構文がV8で実装されたが、その後廃止された 説明 具体的には、strictモードの是非を問わず、「 return continue fn() 」という形での呼び出しについて最適化が有効になる。 (詳細は明示的でない末尾呼び出し最適化の記事をご覧ください) 最適化が効く例: function fn( n ) { 'use strict' if ( n <= 0 ) { return 'done!' } return continue fn( n - 1 ) } fn( 1e6 ) // "done!" 最適化が効かない例: function fn( n ) { 'use strict' if ( n

    明示的な末尾呼び出し最適化構文が実装された - JS.next
    yosuke_furukawa
    yosuke_furukawa 2016/04/27
    return continue !!!!
  • ユニコード文字プロパティについて - JS.next

    概要 正規表現でひらがなにマッチさせる場合によく「 /[ぁ-ん]/ 」とするが、これを「 \p 」エスケープ表現を使って、 「 /\p{Block=Hiragana}/u 」のように分かりやすく書けるようにするための新たな仕様がV8で実装された。 基 文字の分類には様々なものがあり、その分類名nameと、その分類での値valueを使って、 「 /\p{name=value}/u 」のように記述する。 hiragana = /^\p{Script=Hiragana}+$/u // スクリプト(言語文字種)分類:平仮名 console.log( hiragana.test( 'あいうえお' ) )  // true console.log( hiragana.test( 'aiueo' ) ) // false // 分類名や値には大抵略称が1つ、または複数設定されており、そちらも使える h

    ユニコード文字プロパティについて - JS.next
  • べき乗演算子が実装された - JS.next

    概要 Math.pow関数の代わりに新しい演算子「 ** 」でべき乗の演算ができるようになった。 例 これが n = Math.pow(3, 2) console.log(n) // 9 n = Math.pow(n, 2) console.log(n) // 81 こう書ける n = 3 ** 2 console.log(n) // 9 n **= 2 console.log(n) // 81 問題 これはどうなるだろうか? console.log( - 3 ** 2 ) 答えは『 SyntaxError 』である。 「 - 3 ** 2 」は「 (- 3) ** 2 」と「 - (3 ** 2) 」のどちらで評価されるか予想しづらい。 それは他の単項演算子についても言えるので、べき乗演算子の左辺に単項演算子が用いられた式を置くことは禁止されている。 そのため、左辺に単項マイナス演算子を

    べき乗演算子が実装された - JS.next
    yosuke_furukawa
    yosuke_furukawa 2016/04/04
    - 3 ** 2 の時の話が秀逸だった
  • function.sentメタプロパティが実装された - JS.next

    概要 ジェネレータ内で直近に送られた値を返すfunction.sentメタプロパティが実装された。 基 これが function *gfn() { let v = yield console.log( v ) } let gen = gfn() gen.next() gen.next( 42 ) //*log* "42" こう書けるようになった。 function *gfn() { yield console.log( function.sent ) } let gen = gfn() gen.next() gen.next( 42 ) //*log* "42" 最初に送られた値を取得する 今までは、最初にnextメソッドで送られた値を取得する方法が無かったが、このメタプロパティを使えば取得することが出来る。 例:function.sent無し gen = gfn( A ) gen.ne

    function.sentメタプロパティが実装された - JS.next
  • 末尾呼び出し最適化が実装された - 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
  • Proxyについて - JS.next

    概要 Proxyを使うとオブジェクトに対する様々な操作に割り込み、好きな振る舞いをさせることが出来る。 記事更新履歴 [2016/03/23] ES2016でenumerateトラップが削除されるのに対応 [2015/12/02] 公開 APIの概要 提供されるメソッド new Proxy( target<Object>, handler<Object> ) -> <Proxy> // targetオブジェクトを基盤としたプロキシを作る // プロキシへの操作を受ける関数を入れたhandlerオブジェクトを指定する Proxy.revocable ( target<Object>, handler<Object> ) -> { proxy<Proxy>, revoke<Function> } // 無効化可能なプロキシをproxyプロパティに持ち、 // 無効化するためのrevokeメソッ

    Proxyについて - JS.next
    yosuke_furukawa
    yosuke_furukawa 2015/12/11
    4.9 か、、、まだ先だな、、、
  • 正規表現の後読みが実装された - 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
  • 正規表現系のシンボルが実装された - JS.next

    概要 ES2015以前は正規表現オブジェクトを引数で取る関数は一般に、内部で引数が正規表現オブジェクトであるかどうかの判定をして、独自の処理をしていたが、 ES2015からは代わりに各処理に合うシンボルプロパティを持っているかどうかの判定をし、そのシンボルメソッドへ処理を委譲するようになった。 導入されるビルトインシンボルとそれを利用するビルトインメソッド一覧 @@match  [4.9.62] Srting.prototype.match string.match( regexp ) → regexp[ @@match ]( string ) @@replace  [4.10.9] String.prototype.replace string.replace( searchValue, replaceValue ) → searchValue[ @@replace ]( string,

    正規表現系のシンボルが実装された - JS.next
  • 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
    yosuke_furukawa
    yosuke_furukawa 2015/10/24
    マジで速いな
  • @@toPrimitiveが実装された - JS.next

    概要 オブジェクトがプリミティブ型に変換される際に、どんな処理を行いどんな値を返すか決めるためのビルトインシンボルが実装された。 解説 JavaScriptでは様々な場合で様々にオブジェクトがプリミティブ型に変換される。 例えば「Number(obj)」や「String(obj)」とすると、それぞれ数値型と文字列型が期待され、 通常それぞれオブジェクトの「valueOf」メソッドと「toString」メソッドが呼び出されることになる。 一方、例えば加算演算子「+」で評価されるとき、両辺の値はまずプリミティブ型に変換されるが、これには期待される型はない。 そのような時、殆どのオブジェクトは「valueOf」メソッドが呼ばれるが、Dateオブジェクトは「toString」メソッドが呼ばれるという特殊な振る舞いをする。 そのようにオブジェクトがプリミティブ型に変換されるときの振る舞いを制御したい

    @@toPrimitiveが実装された - JS.next
  • 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
    yosuke_furukawa
    yosuke_furukawa 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
  • 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
    yosuke_furukawa
    yosuke_furukawa 2015/05/08
    きた!
  • 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
    yosuke_furukawa
    yosuke_furukawa 2015/03/25
    ふおおおお。
  • Restパラメータ/Spreadコールが実装されてきている - JS.next

    概要 Restパラメータ/Spreadコールを使うと、可変長引数が扱いやすくなる。 Restパラメータ [4.2.71] [4.5.48] 関数定義の引数部分に『...args』と記述すると、全ての引数の配列をargsで受け取ることができる。 [4.2.71] 例:引数の中で最大の数を得る max( 5, 15, 10 ) function max( ...args ) { console.log( Array.isArray( args ) ) //-> true console.log( args.length ) //-> 3 var max = args.reduce( (max, n) => n > max ? n : max, -Infinity ) console.log( max ) //-> 15 } また、argumentsのないアロー関数でも使用することができる。 [

    Restパラメータ/Spreadコールが実装されてきている - JS.next
  • オブジェクトリテラルのキーに式が使えるようになった - JS.next

    概要 今までオブジェクトリテラルのキー部分には固定の文字列を指定するしかなかったが、ES2015では動的な式の結果やSymbolを指定することができる。 使い方 キー部分を括弧『[ ]』で囲むと、オブジェクトリテラルが評価される時に括弧間の式が評価され、その結果がキーとなる。 つまりこれを var key = 'hoge' var obj = { } obj[key] = val こう書くことができる。 var key = 'hoge' var obj = { [key]: val } この記法はSymbolをキーにすることもでき、Class構文でも使える。 そしてメソッド定義記法と合わせてこの様に使える。 class Cat { get [ Symbol.toStringTag ]() { return 'Cat' } } console.log( '' + new Cat ) // "

    オブジェクトリテラルのキーに式が使えるようになった - JS.next
    yosuke_furukawa
    yosuke_furukawa 2015/01/27
    あーはん
  • @@isConcatSpreadableが実装された - JS.next

    概要 @@isConcatSpreadableは、Array.prototype.concatメソッドにおいての振る舞いを指定するビルトインシンボルである。 解説 concatメソッドは、元の配列と各引数に与えられた配列を連結して新しい配列を作るメソッドである。 もし引数に渡された値が配列でない場合は、その値自体が新しい配列の要素になる。 var a12 = [ 1, 2 ] var a34 = [ 3, 4 ] var a56 = [ 5, 6 ] a12.concat( a34, a56 ) // [ 1, 2, 3, 4, 5, 6 ] では、ArrayLikeなオブジェクトを渡すとどうなるかというと、配列と見てもらえずそのオブジェクト自身が新しい配列の要素になってしまう。 そうではなく、そのオブジェクトの各値を連結して欲しい時に活躍するのが、@@isConcatSpreadable

    @@isConcatSpreadableが実装された - JS.next
    yosuke_furukawa
    yosuke_furukawa 2014/12/16
    ほほーん
  • ユニコードエスケープシーケンスが拡張された - 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