JavaScriptでのバックティック文字( `)の使用


277

JavaScriptでは、バックティックは単一引用符と同じように機能します。たとえば、バックティックを使用して次のような文字列を定義できます。

var s = `abc`;

バックティックの動作が実際に単一引用符の動作と異なる方法はありますか?


†プログラマの間では、「バックティック」は、より一般的に重大アクセントと呼ばれるものの1つの名前であることに注意してください。プログラマーは、別名「backquote」と「backgrave」を時々使用します。また、Stack Overflowなどでは、「backtick」の他の一般的なスペルは「back-tick」と「back tick」です。


タグ付きテンプレートの使用方法については、以下をお読みください。これは、尋ねられる質問とは異なる使用法です。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… そして、これは以下の長い回答の1つで説明されています。 stackoverflow.com/a/40062505/3281336
PatS

1
急性アクセントと呼ばれています-何の前進墓のアクセントがないため、「backgrave」は、ばかげている
ウォルターTross

回答:


297

これは、テンプレートリテラルと呼ばれる機能です。

それらは、ECMAScript 2015仕様の以前のエディションでは「テンプレート文字列」と呼ばれていました。

テンプレートリテラルは、Firefox 34、Chrome 41、およびEdge 12以降でサポートされていますが、Internet Explorerではサポートされていません。

テンプレートリテラルは、複数行の文字列を表すために使用でき、変数を挿入するために「補間」を使用できます。

var a = 123, str = `---
   a is: ${a}
---`;
console.log(str);

出力:

---
   a is: 123
---

さらに重要なのは、変数名だけでなく、JavaScript式を含めることができることです。

var a = 3, b = 3.1415;

console.log(`PI is nearly ${Math.max(a, b)}`);

2
それに対するサポートの欠如を考えると、これのための実行可能なポリフィルはありますか?
Alexander Dixon

3
@AlexanderDixon、いいえ。古典的な意味でこの言語機能をポリフィルすることはできませんが、配列を使用した文字列の複数行文字列と組み合わせて、文字列の変数にアンダースコアまたはロダッシュのテンプレートを使用できます["a", "b"].join(""); // both string elements written in new lines。しかし、これとは別に、Babelのような「トランスパイラー」を使用してES6 +をES5に変換することもできます
try-catch-finally

2
バックティックを使用したタグ付きテンプレートリテラル!これは有効であり、適切に機能しますalert`1`
КонстантинВан

@UnionP MS Edgeを含むすべての主要なブラウザーでサポートされています:kangax.github.io/compat-table/es6/#test-template_literals
Jonathan Cross

2
@kikiスクリプト言語はECMAScriptのバリアントのようです。Google AppスクリプトはECMAScript 2015の機能を明らかにサポートしていません。彼らが使用している言語の公式仕様を見つけることができませんでした。
try-catch-finally

162

ECMAScript 6は、バックティックを区切り文字として使用して、新しいタイプの文字列リテラルを生み出します。これらのリテラルを使用すると、基本的な文字列補間式を埋め込むことができます。これらの式は自動的に解析および評価されます。

let person = {name: 'RajiniKanth', age: 68, greeting: 'Thalaivaaaa!' };

let usualHtmlStr = "<p>My name is " + person.name + ",</p>\n" +
  "<p>I am " + person.age + " old</p>\n" +
  "<strong>\"" + person.greeting + "\" is what I usually say</strong>";

let newHtmlStr =
 `<p>My name is ${person.name},</p>
  <p>I am ${person.age} old</p>
  <p>"${person.greeting}" is what I usually say</strong>`;

console.log(usualHtmlStr);
console.log(newHtmlStr);

ご覧のとおり`、文字列リテラルとして解釈される一連の文字を使用しましたが、フォームの式はすべて${..}インラインで解析および評価されます。

補間された文字列リテラルの本当に良い利点の1つは、複数の行に分割できることです。

var Actor = {"name": "RajiniKanth"};

var text =
`Now is the time for all good men like ${Actor.name}
to come to the aid of their
country!`;
console.log(text);
// Now is the time for all good men
// to come to the aid of their
// country!

補間された式

${..}関数呼び出し、インライン関数式呼び出し、その他の補間された文字列リテラルを含め、補間された文字列リテラル内に有効な式を含めることができます!

function upper(s) {
  return s.toUpperCase();
}
var who = "reader"
var text =
`A very ${upper("warm")} welcome
to all of you ${upper(`${who}s`)}!`;
console.log(text);
// A very WARM welcome
// to all of you READERS!

ここでは、内部の`${who}s`補間された文字列リテラルは、who変数と"s"文字列を組み合わせるときに、とは対照的に少し便利でしたwho + "s"。また、メモを保持するために、補間された文字列リテラルは、それが現れる場所でレキシカルにスコープされているだけであり、動的にスコープされていない:

function foo(str) {
  var name = "foo";
  console.log(str);
}
function bar() {
  var name = "bar";
  foo(`Hello from ${name}!`);
}
var name = "global";
bar(); // "Hello from bar!"

HTMLのテンプレートリテラルを使用すると、煩わしさが軽減されるため、間違いなく読みやすくなります。

単純な古い方法:

'<div class="' + className + '">' +
  '<p>' + content + '</p>' +
  '<a href="' + link + '">Let\'s go</a>'
'</div>';

ECMAScript 6の場合:

`<div class="${className}">
  <p>${content}</p>
  <a href="${link}">Let's go</a>
</div>`
  • 文字列は複数行にまたがることができます。
  • 引用文字をエスケープする必要はありません。
  • 次のようなグループ化を回避できます: '">'
  • plus演算子を使用する必要はありません。

タグ付きテンプレートリテラル

テンプレート文字列にタグを付けることもできます。テンプレート文字列がタグ付けされると、リテラルと置換が結果の値を返す関数に渡されます。

function myTaggedLiteral(strings) {
  console.log(strings);
}

myTaggedLiteral`test`; //["test"]

function myTaggedLiteral(strings, value, value2) {
  console.log(strings, value, value2);
}
let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
//["test", ""]
// "Neat"
// 5

ここでは、spread演算子を使用して複数の値を渡すことができます。最初の引数(文字列と呼びます)は、すべてのプレーン文字列(補間された式の間のもの)の配列です。

次に... gather/rest operator、を使用して、後続のすべての引数を値と呼ばれる配列にまとめますが、もちろんvalue1、上記のように、文字列パラメーターに続く個別の名前付きパラメーター(value2、など)のままにすることもできます。

function myTaggedLiteral(strings, ...values) {
  console.log(strings);
  console.log(values);
}

let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
//["test", ""]
// "Neat"
// 5

values配列に収集された引数は、文字列リテラルで見つかった既に評価された補間式の結果です。タグ付き文字列リテラルは、補間が評価された後、最終的な文字列値がコンパイルされる前の処理手順に似ているため、リテラルからの文字列の生成をより細かく制御できます。再利用可能なテンプレートを作成する例を見てみましょう。

const Actor = {
  name: "RajiniKanth",
  store: "Landmark"
}

const ActorTemplate = templater`<article>
  <h3>${'name'} is a Actor</h3>
  <p>You can find his movies at ${'store'}.</p>

</article>`;

function templater(strings, ...keys) {
  return function(data) {
    let temp = strings.slice();
    keys.forEach((key, i) => {
      temp[i] = temp[i] + data[key];
    });
    return temp.join('');
  }
};

const myTemplate = ActorTemplate(Actor);
console.log(myTemplate);

生の弦

タグ関数は、文字列と呼ばれる配列である最初の引数を受け取ります。ただし、追加のデータビットが含まれています。すべての文字列の未処理バージョンです。次の.rawように、プロパティを使用してこれらの生の文字列値にアクセスできます。

function showraw(strings, ...values) {
  console.log(strings);
  console.log(strings.raw);
}
showraw`Hello\nWorld`;

ご覧のように、文字列の未\n処理バージョンはエスケープされたシーケンスを保持しますが、処理されたバージョンの文字列はエスケープされていない実際の改行のように扱います。ECMAScript 6には、文字列リテラルタグとして使用できる組み込み関数が付属していますString.raw(..)。それは単に文字列の生バージョンを通過します:

console.log(`Hello\nWorld`);
/* "Hello
World" */

console.log(String.raw`Hello\nWorld`);
// "Hello\nWorld"

1
正解です。マイナーなコメントですが、タグ付きテンプレートリテラルセクションで、配列の出力の2つの例はmyTaggedLiteral`test ${someText} ${2 + 3}`;はずです//["test ", " "](つまり、トリミングされた文字列ではない)。
マイケルクレブス

3
下にスクロールして著者のアカウントを表示しましたが、がっかりしませんでした!良い説明。xD
varun 2018年

良い説明と幅広い報道、ありがとうございました。Mozilla開発者サイトのテンプレートリテラル(テンプレート文字列)にも概要があり、いくつかの追加の側面について説明しています。
Dev Ops

1
Nit:「ECMAScript 6には新しいタイプの文字列リテラルが用意されていますこれは文字列リテラルではなく、テンプレートリテラルです。タグ付けされていない場合は、評価時に文字列になります。これは独断的ではなく、テンプレートリテラルが許可されていない場所で文字列リテラルを使用できる場所があります(計算されていないパラメーター名、モジュール識別子など)。
TJクラウダー

「補間された文字列リテラルはレキシカルにスコープされているだけです」を含む文は理解できません。直せますか?
Peter Mortensen

21

バッククォート(`)は、テンプレートリテラルを定義するために使用されます。テンプレートリテラルは、文字列の操作を容易にするECMAScript 6の新機能です。

特徴:

  • テンプレートリテラル内の任意の種類の式を補間できます。
  • 複数行にすることもできます。

注:バッククォート()内では、単一引用符(')と二重引用符()を簡単に使用できます。"`

例:

var nameStr = `I'm "Rohit" Jindal`;

変数または式を補間するには、その${expression}表記法を使用できます。

var name = 'Rohit Jindal';
var text = `My name is ${name}`;
console.log(text); // My name is Rohit Jindal

複数行の文字列は、\n新しい行に使用する必要がなくなったことを意味します。

例:

const name = 'Rohit';
console.log(`Hello ${name}!
How are you?`);

出力:

Hello Rohit!
How are you?

15

バックティックは、以前はテンプレート文字列と呼ばれていたテンプレートリテラルを囲みます。テンプレートリテラルは、埋め込み式と文字列補間機能を可能にする文字列リテラルです。

テンプレートリテラルにはプレースホルダーに埋め込まれた式があり、ドル記号と式を囲む中括弧で示され${expression}ます。プレースホルダー/式は関数に渡されます。デフォルトの関数は、文字列を連結するだけです。

バックティックをエスケープするには、その前にバックスラッシュを置きます:

`\`` === '`'; => true

バックティックを使用して、複数行の文字列をより簡単に記述します。

console.log(`string text line 1
string text line 2`);

または

console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);

対バニラJavaScript:

console.log('string text line 1\n' +
'string text line 2');

または

console.log('Fifteen is ' + (a + b) + ' and\nnot ' + (2 * a + b) + '.');

エスケープシーケンス:

  • によって開始されたUnicodeエスケープ\u、たとえば\u00A9
  • \u{}たとえば、で示されるUnicodeコードポイントエスケープ\u{2F804}
  • \xたとえば、で始まる16進エスケープ\xA9
  • \たとえば、(a)数字で始まる8進リテラルエスケープ\251

10

概要:

JavaScriptのバックティックは、動的な文字列を簡単に作成するためにECMAScript 6 // ECMAScript 2015で導入された機能です。このECMAScript 6機能は、テンプレート文字列リテラルとも呼ばれます。通常の文字列と比較すると、次の利点があります。

  • テンプレート文字列では改行が許可されているため、複数行にすることができます。通常の文字列リテラル(''またはで宣言"")は改行できません。
  • ${myVariable}構文を使用して、変数値を文字列に簡単に補間できます。

例:

const name = 'Willem';
const age = 26;

const story = `
  My name is: ${name}
  And I'm: ${age} years old
`;

console.log(story);

ブラウザーの互換性:

テンプレート文字列リテラルは、すべての主要なブラウザーベンダー(Internet Explorerを除く)でネイティブにサポートされています。したがって、本番コードで使用するのはかなり節約できます。ブラウザの互換性のより詳細なリストはここにあります



7

良い点は、基本的な数学を直接作成できることです。

let nuts = 7

more.innerHTML = `

<h2>You collected ${nuts} nuts so far!

<hr>

Double it, get ${nuts + nuts} nuts!!

`
<div id="more"></div>

それはファクトリー関数で本当に役に立ちました:

function nuts(it){
  return `
    You have ${it} nuts! <br>
    Cosinus of your nuts: ${Math.cos(it)} <br>
    Triple nuts: ${3 * it} <br>
    Your nuts encoded in BASE64:<br> ${btoa(it)}
  `
}

nut.oninput = (function(){
  out.innerHTML = nuts(nut.value)
})
<h3>NUTS CALCULATOR
<input type="number" id="nut">

<div id="out"></div>


3
他の誰も今すぐ
cmonを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.