ES 2018新特徴その:非エスケープシーケンスのテンプレート文字列


ES 2018新機能
  • ひどうき反復器
  • 正規表現の逆方向(lookbehind)断言
  • 正規表現Unicodeエスケープ
  • 非エスケープシーケンスのテンプレート文字列(本明細書)
  • 正規表現s/dotAllモード
  • 正規表現名取得グループ
  • オブジェクト展開演算子
  • Promise.prototype.finally

  • このECMAScript提案「Template Literal Revision」はTim Disneyが担当しており、現在ステージ4に入っており、本提案はECMAScript 2018(ES 9)の一部である.この提案では,テンプレート文字列のラベル関数構文をより自由に使用する.
    1.タグ関数Tagged templates
    ラベルを使用すると、テンプレート文字列を関数で解析できます.ラベル関数の最初のパラメータには、文字列値の配列が含まれます.残りのパラメータは式に関連しています.最後に、関数は処理された文字列を返すことができます(または、全く異なるものを返すことができます).
    function foo(str) {
        return str[0].toUpperCase();
    }
    
    foo`justjavac`; //    JUSTJAVAC
    foo`Xyz`; //    XYZ

    2. String.raw() String.raw()はテンプレート文字列のラベル関数であり、Pythonの文字列接頭辞rおよびC#の文字列接頭辞@と同様に、テンプレート文字列の元の字面量値を取得するために使用される.
    構文:
    String.raw(callSite, ...substitutions)
    String.raw`templateString`
    String.raw()は、組み込まれている唯一のテンプレート文字列ラベル関数です.
    var str = String.raw`Hi
    ${2+3}!`; // "Hi
    5!" str.length; // 6 str.split('').join(','); // // :"H,i,\,n,5,!"

    3.元の文字列
    ラベル関数の最初のパラメータには、特殊な属性rawが存在し、特殊な文字の置換を経ずにテンプレート文字列の元の文字列にアクセスできます.
    function foo(str) {
        console.log(str);
        return str[0].toUpperCase();
    }
    
    foo`justjavac`;
    
    //      
    ["justjavac", raw: ["justjavac"]]
    
    foo`just\\java\\c`;
    //      
    ["just\java\c", raw: ["just\\java\\c"]]

    4.タグ関数付きエスケープシーケンス
    ES 2016以降、ラベル付きテンプレートの字面量は、以下のエスケープシーケンスのルールを遵守している.
  • Unicode文字は「u」で始まる、例えば\u00A9
  • である.
  • Unicode符号ビットは「u{}」で表され、例えば\u{2F804}
  • である.
  • 16進数は「x」で始まる、例えば\xA9
  • である.
  • 8進数は「」と数字で始まる、例えば\251
  • .
    各ECMAScript構文について、解析器は有効なエスケープシーケンスを検索し、無効なエスケープシーケンスについてSyntaxErrorを直接放出します.
    String.raw`\`;
    Uncaught SyntaxError: Unterminated template literal

    5.ES 2018不正エスケープシーケンスの改訂について
    ラベル関数付きテンプレート文字列は、一般的なエスケープシーケンスをサポートする言語(例えば、DSLsLaTeX)をネストすることを可能にするべきである.
    したがって、ECMAScript 2018規格は、ラベル付きテンプレート文字列におけるECMAScriptのエスケープシーケンスの構文制限を除去する.
    function tag(strs) {
      strs[0] === undefined
      strs.raw[0] === "\\unicode and \\u{55}";
    }
    
    //         
    tag`\unicode and \u{55}`; //     undefined
    
    //          
    let bad = `bad escape sequence: \unicode`;
    // throws early error:SyntaxError: Invalid Unicode escape sequence

    6.実現
  • V8 - Chrome 62
  • SpiderMonkey - Firefox 53
  • JavaScriptCore-バージョン不明
  • ChakraCore-開発中
  • Babel - 7.x

  • 7.関連リンク:
  • https://github.com/tc39/propo...
  • https://tc39.github.io/propos...
  • https://developer.mozilla.org...