Використання символу backtick (`) у JavaScript


277

У JavaScript, backtick †, здається, працює так само, як і одна цитата. Наприклад, я можу використовувати backtick, щоб визначити такий рядок:

var s = `abc`;

Чи існує спосіб, за яким поведінка бейтіка насправді відрізняється від поведінки однієї цитати?


† Зауважте, що серед програмістів "backtick" - це одне ім'я для того, що загалом називається серйозним акцентом . Програмісти також іноді використовують альтернативні назви "backquote" та "backgrave". Крім того, на Stack Overflow та інших місцях, іншими поширеними написаннями для "backtick" є "back-tick" та "back tick".


Прочитайте нижче про використання тегів "Шаблони". Це інше використання, ніж питання, яке задають. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… І це пояснено в одній з більш довгих відповідей нижче. stackoverflow.com/a/40062505/3281336
поплескує

1
"Backgrave" смішно, тому що немає прямого могильного акценту - так називається гострий акцент
Walter 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
Чи є для цього життєздатні поліфіли зважаючи на відсутність підтримки для цього?
Олександр Діксон

3
Чи не @AlexanderDixon, немає , ви не можеш polyfill цієї функції мови в класичному сенсі, хоча ви можете використовувати шаблони з Underscore або lodash для змінних в рядках в поєднанні з multilining рядків з використанням масивів: ["a", "b"].join(""); // both string elements written in new lines. Але окрім цього, для перетворення ES6 + на ES5 можна використати "транспілер" на зразок Babel
try-catch-нарешті

2
Теги буквених літералів за допомогою зворотних посилань! Це справедливо і добре працює:alert`1`.
Константин Ван

@UnionP Підтримується всіма основними браузерами, включаючи MS Edge: kangax.github.io/compat-table/es6/#test-template_literals
Jonathan Cross

2
@kiki, схоже, мова скрипту є варіантом ECMAScript. Сценарії додатків Google очевидно не підтримують функції ECMAScript 2015. Мені не вдалося знайти офіційну специфікацію, якою мовою вони користуються.
try-catch-нарешті

162

ECMAScript 6 пропонує новий тип літерального рядка, використовуючи backtick в якості роздільника. Ці літерали дозволяють вбудовувати базові вирази інтерполяції рядків, які потім автоматично аналізуються та оцінюються.

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);

Як бачимо, ми використовували `навколо серії символів, які інтерпретуються як рядкові букви, але будь-які вирази форми ${..}аналізуються та оцінюються в одразу.

Одним із приємних переваг інтерпольованих рядкових літералів є те, що їм дозволяється розділятись на кілька рядків:

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>`
  • Ваша рядок може охоплювати кілька рядків.
  • Вам не доведеться уникати цитатних символів.
  • Ви можете уникати угруповань, таких як: '">'
  • Не потрібно використовувати оператор плюс.

Теги літератури шаблону

Ми також можемо позначати рядок шаблону, коли рядок шаблону позначено тегами, буквалі та підстановки передаються функції, яка повертає отримане значення.

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

Тут ми можемо використовувати оператор розповсюдження для передачі декількох значень. Перший аргумент - ми його називали рядками - це масив усіх простих рядків (впорядкованість між будь-якими інтерпольованими виразами).

Потім зібрати всі наступні аргументи на званих значення масиву з допомогою ... 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

Аргументи (аргументи), зібрані в наш масив значень, є результатами вже оцінених виразів інтерполяції, знайдених у рядковому літералі. Теговий рядковий літерал - це схожий крок обробки після оцінки інтерполяцій, але до того, як буде складено остаточне значення рядка, що дозволяє вам більше контролювати генерування рядка з літералу. Давайте розглянемо приклад створення шаблонів для багаторазового використання.

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
Чудова відповідь! Незначний коментар у вашому розділі Tagged Literals Literals, я вважаю, що два приклади масивів для прикладу myTaggedLiteral`test ${someText} ${2 + 3}`;повинні бути //["test ", " "](тобто не обрізаними рядками).
Майкл Кребс

3
Прокрутився вниз, щоб побачити рахунок автора, не розчарувався! Гарне пояснення. xD
varun

Гарне пояснення та широке висвітлення, дякую. Хотілося лише додати, що на сайті розробника Mozilla також є хороший огляд літературних шаблонів (рядки шаблону), що висвітлює деякі додаткові аспекти.
Dev Ops

1
Ніт: "ECMAScript 6 пропонує новий тип літерального рядка" Це не літеральний рядок, це буквальний шаблон. Це призводить до рядка при оцінці, якщо він не позначений. Це не просто догматично, є місця, де ви можете використовувати рядкові літерали, де літерали шаблону заборонені (наприклад, незачислені імена параметрів, ідентифікатори модулів ...).
TJ Crowder

Речення, що включає в себе "є інтерпольованим рядковим буквеним словом, просто лексично охоплено" , незрозуміле. Ви можете це виправити?
Пітер Мортенсен

21

Backticks ( `) використовуються для визначення літералів шаблону. Літерали шаблонів - це нова функція в 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
  • Уникає кодова точка Unicode, вказана \u{}, наприклад,\u{2F804}
  • \xНаприклад, шестидесятичні втечі, розпочаті , наприклад\xA9
  • Октальні буквальні втечі, розпочаті, наприклад, з \(а) цифр (и)\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). Так що це досить заощадити для використання у виробничому коді. Більш детальний список сумісності браузера можна знайти тут .


10

Крім рядкової інтерполяції, ви також можете викликати функцію за допомогою зворотного галочки.


var sayHello = function () {
    console.log('Hello', arguments);
}

// To call this function using ``

sayHello`some args`; // Check console for the output

// Or
sayHello`
    some args
`;

Перевірте стильовий компонент . Вони активно використовують його.


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
хіба ніхто більше не хихикав Смонсон
StayCool
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.