String.raw:いくつかの機能と制限

I.機会



MDNを読んだとき:「静的String.raw()



メソッドは、テンプレートリテラルのタグ関数であり、Pythonのr



プレフィックスまたは
文字列リテラルのC#の@



プレフィックスに似てい
ます」 JavaScriptには、Perlの単一引用符のようなものが欠けていました。



私はすぐにいくつかの用途を考え出し、それらをスクリプトで積極的に使用し始めました。



1. Windowsファイルへのパスを二重エスケープなしで定義します。



 const r = String.raw; const test_module = require(r`e:\DOC\prg\js\node\-lib\test.js`);
      
      





2. Windowsレジストリキーへのパスを決定します。



 const r = String.raw; const Winreg = require('winreg'); const regKey = new Winreg({ hive: Winreg.HKCU, key: r`\Software\MPC-HC\MPC-HC\Settings` });
      
      





3.複合リテラルから複雑な正規表現を作成します。



最近の記事のコード例を参照してください。



II。 制限事項



しかし、時間が経つにつれて、予期せぬ制限に遭遇し始めました。 V8バグトラッカーでそれらの1つについて書いたので、私は落ち着いた説明を得ました。 String.raw



はエスケープされたリテラルを解釈せずに文字列を生成しますが、コードを解析する段階で、アナライザーはまだリテラルがルールに準拠している必要があることがString.raw



ます。 上記のユースケースの明白な制限は、これから続きます。



1.バックスラッシュの後に、対応する16進シーケンスがないとx



またはu



を続けることはできません。




次のコードUncaught SyntaxError: Invalid hexadecimal escape sequence



エラーをUncaught SyntaxError: Invalid hexadecimal escape sequence



ます。



 console.log(String.raw`:\x.js`);
      
      





次のコードUncaught SyntaxError: Invalid Unicode escape sequence



errorをUncaught SyntaxError: Invalid Unicode escape sequence



ます:



 console.log(String.raw`:\u.js`);
      
      





さらに、正しい組み合わせはまだ解釈されずにシリアル化されます。



 console.log(String.raw`\x61`); //\x61 console.log(String.raw`\u0061`); //\u0061
      
      





私は問題を解決する簡単な方法を見つけませんでした:



 console.log(String.raw`:\\x.js`); // :\\x.js console.log(String.raw`:\\x78.js`); // :\\x78.js console.log(String.raw`:\${'x'}.js`); // :\${'x'}.js console.log(String.raw`:\\${'x'}.js`); // :\\x.js console.log(String.raw`:\\u.js`); // :\\u.js console.log(String.raw`:\\x75.js`); // :\\x75.js console.log(String.raw`:\${'u'}.js`); // :\${'u'}.js console.log(String.raw`:\\${'u'}.js`); // :\\u.js
      
      





実用的なソリューションは非常に複雑であるため、通常の二重シールド引用符を使用して簡単に戻ることができます。



 console.log(String.raw`:${'\\'}x.js`); // :\x.js console.log(String.raw`:${'\\'}u.js`); // :\u.js
      
      





エスケープされたリテラルとの残りの一致は問題を引き起こさず、文字どおり表示されます。



 console.log(String.raw`:\ab\0 cd`); console.log(String.raw`:\ab\' cd`); console.log(String.raw`:\ab\" cd`); console.log(String.raw`:\ab\\ cd`); console.log(String.raw`:\ab\n cd`); console.log(String.raw`:\ab\r cd`); console.log(String.raw`:\ab\v cd`); console.log(String.raw`:\ab\t cd`); console.log(String.raw`:\ab\b cd`); console.log(String.raw`:\ab\f cd`);
      
      





2.文字列に`



文字自体を含める簡単な方法はありません。




この記号は英語のアポストロフィを置き換える場合があり、 一部の音訳システムでも使用されます



Uncaught SyntaxError: missing ) after argument list



予想エラーのUncaught SyntaxError: missing ) after argument list







 console.log(String.raw`:\John`s.js`);
      
      





壊れたソリューション:



 console.log(String.raw`:\John\`s.js`); // :\John\`s.js console.log(String.raw`:\John\x60s.js`); // :\John\x60s.js
      
      





不当な複雑さ:



 console.log(String.raw`:\John${'`'}s.js`); // :\John`s.js
      
      





3.最後にバックスラッシュ文字列を作成する簡単な方法はありません。



Uncaught SyntaxError: Unterminated template literal



予期しないエラー:



 console.log(String.raw`:\`);
      
      





壊れたソリューション:



 console.log(String.raw`:\\`); // :\\ console.log(String.raw`:\x5c`); // :\x5c
      
      





不当な複雑さ:



 console.log(String.raw`:${'\\'}`); // :\
      
      





III。 他の言語との比較



メモの冒頭で述べた言語の対応する手段は、期待どおりに機能します 。これは、たとえばここで確認できます



C#







Perl







Python







String.raw



を使用する他の興味深い方法を見つけたり、他の予期しない制限にString.raw



したり、それらを回避するためのエレガントな方法を思いついた場合は、共有してください。



PS保留中の変更: www.2ality.com/2016/09/template-literal-revision.html



All Articles