タグ

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

  • 正規表現にdotAllフラグが追加された - JS.next

    概要 正規表現でドット「.」を改行文字にもマッチさせることができるようになった。 説明 正規表現でドット「.」は殆どの文字にマッチするが、改行文字にはマッチしないという性質がある。 ES2018ではs(dotAll)フラグを付けることで、ドットを改行文字にもマッチさせることができるようになった。 例: var text = ` JavaScriptは【プロトタイプベ ース】のオブジェクト指向言語 である` // 【】の中身が欲しいとき、改行文字が含まれるためドットを使うと上手くいかない text.match( /【.+】/ ) // null // ES2017以前は改行文字にもマッチさせるためにしばしば/[\s\S]/や/[^]/が使われてきた text.match( /【[\s\S]+】/ ) // "【プロトタイプベ↵ース】" text.match( /【[^]+】/ ) // "【

    正規表現にdotAllフラグが追加された - JS.next
  • try-catch構文で例外を受け取る変数の指定を省略できるようになった - JS.next

    概要 try {  } catch( err ) {  }の( err )の部分を省略することができるようになった。 説明 例外の内容によって処理を変えたりできるように、try-catch構文のcatch句ではErrorオブジェクトを受け取る変数を指定するようになっている。 ただしErrorオブジェクト利用しない場合もよくあるため、ES2019からは省略することが可能になった。 例: try { throw 'Hoge' } catch { // 例外が起きた時内容は受け取れないが、ここが実行される } 実装されるバージョン V8 6.5.150

    try-catch構文で例外を受け取る変数の指定を省略できるようになった - JS.next
  • 正規表現の名前付きキャプチャが実装された - JS.next

    概要 正規表現内の好きな部分に名前を付け、その名前を使ってマッチ結果を参照できるようになった。 共通 あるパターン「pattern」に名前「name」を付けたい時は(?<name>pattern)と記述する。 例:日付文字列にマッチする正規表現の、「年」「月」「日」の部分にそれぞれ「year」「month」「day」という名前を付ける // ES2018以降 re2018 = /(?<year>\d{4})年(?<month>\d{1,2})月(?<day>\d{1,2})日/u // ES2017以前 re2017 = /(\d{4})年(\d{1,2})月(\d{1,2})日/ (※名前付きキャプチャを使うには正規表現にユニコードフラグ/regexp/uを付ける必要がある) マッチについて 正規表現オブジェクトのmatchやexecメソッドを呼ぶと、返り値のオブジェクトのgroupsプ

    正規表現の名前付きキャプチャが実装された - JS.next
    igrep
    igrep 2018/09/07
    uを着ける必要があるのは互換性のためなんだろうか。
  • Promise.prototype.finallyが実装された - JS.next

    概要 プロミスの成功・失敗に関わらず継続して処理を行うためのPromise.prototype.finallyメソッドが実装された 参考記事 Promiseについて - JS.next イメージ 従来、処理が成功しても失敗しても最後に行いたい処理を記述するためには、thenメソッドの2つの引数両方に指定するなどするしかなかった。 showMessage( '読込中……' ) fetchData( 'hoge' ) .then( data => showData( data ) ) .catch( ( ) => showData( null ) ) .then( ( ) => showMessage( '読込完了!' ), ( ) => showMessage( '読込完了!' ) ) それがfinallyメソッドを使うとこう書ける。 showMessage( '読込中……' ) fetch

    Promise.prototype.finallyが実装された - JS.next
  • Spread/Restプロパティが実装された - JS.next

    概要 配列のSpread/Rest構文のように、オブジェクト内に別のオブジェクトを展開する構文が実装された。 比較例 Spread ES2017以前こう書いていたのが // オブジェクト o1 と o2 を合成し、プロパティ c を加えたものを o3 としたい o1 = { a: 1 } o2 = { b: 2 } o3 = Object.assign( { }, o1, o2, { c: 3 } ) ES2018以降こう書ける // オブジェクト o1 と o2 を合成し、プロパティ c を加えたものを o3 としたい o1 = { a: 1 } o2 = { b: 2 } o3 = { ...o1, ...o2, c: 3 } オブジェクトの合成が簡単にできるようになる。 Rest ES2017以前こう書いていたのが // プロパティ a, b と残りをまとめたものを r として取り出

    Spread/Restプロパティが実装された - JS.next
  • 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
    igrep
    igrep 2016/05/20
    実装されたのか。
  • 明示的な末尾呼び出し最適化構文が実装された - 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
    igrep
    igrep 2016/04/28
    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
  • 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
    igrep
    igrep 2016/04/20
  • String.prototype.pad{Start,End}が実装された - JS.next

    概要 対象の文字列の先頭や終わりに、指定した長さになるように、指定した文字列を繰り返して埋めるメソッドが実装された。 例 第一引数に期待する文字列の長さ、第二引数に埋める文字列を指定する(未指定時はスペースが使われる)。 num = 123 ;(''+num).padStart(5, 0) // "00123" str = 'abc' str.padEnd(20, '。・゚・') // "abc。・゚・。・゚・。・゚・。・゚・。" 実装されるバージョン V8 5.1.217

    String.prototype.pad{Start,End}が実装された - 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
    igrep
    igrep 2016/03/23
    “ - 3 ** 2”が問題になって"- 3 * 2"が問題にならないのはどう解釈しても計算の意味が変わらないから?
  • @@hasInstanceが実装された - JS.next

    概要 インスタンスであるか判定するためのビルトインシンボルが実装された。 解説 instanceof演算子が「 obj instanceof C 」の形で使われると、「 C[@@hasInstance] 」が定義されていた場合objを引数に呼ばれ、それが返す真偽値が返される。 class X { } class A { static [Symbol.hasInstance](obj) { return obj.constructor == X } } let a = new A, x = new X console.log( a instanceof A ) // false console.log( x instanceof A ) // true ちょっと変わった利用例 型判定に使う const StringOrNumber = { [Symbol.hasInstance](v) {

    @@hasInstanceが実装された - JS.next
    igrep
    igrep 2016/03/09
    どんどんメタプログラミング向けになっていくな…
  • 末尾呼び出し最適化が実装された - 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
    igrep
    igrep 2016/01/29
    "デバッガが起動していると最適化が無効になる"
  • @@speciesが実装された - JS.next

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

    @@speciesが実装された - JS.next
    igrep
    igrep 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
    igrep
    igrep 2015/11/20
    おお、この間ないかな、って思ったやつだった!
  • 正規表現系のシンボルが実装された - 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
    igrep
    igrep 2015/11/19
    " ES2015からは代わりに各処理に合うシンボルプロパティを持っているかどうかの判定をし、そのシンボルメソッドへ処理を委譲"
  • 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
    igrep
    igrep 2015/10/24
    do記法じゃなかった 😔
  • 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
    igrep
    igrep 2015/04/16
    やっぱsyntax sugarなのね。良かった。
  • 1