Sử dụng ký tự backtick (`) trong JavaScript


276

Trong JavaScript, một backtick dường như hoạt động giống như một trích dẫn. Chẳng hạn, tôi có thể sử dụng backtick để xác định một chuỗi như thế này:

var s = `abc`;

Có cách nào mà hành vi của backtick thực sự khác với cách trích dẫn không?


Lưu ý rằng trong số các lập trình viên, "backtick" là một tên cho cái thường được gọi là trọng âm . Các lập trình viên đôi khi cũng sử dụng các tên thay thế "backquote" và "backgrave". Ngoài ra, trên Stack Overflow và các nơi khác, các cách viết phổ biến khác cho "backtick" là "back-tick" và "back tick".


Vui lòng đọc bên dưới để sử dụng Mẫu được gắn thẻ. Đây là một cách sử dụng khác với câu hỏi đang được hỏi. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/, Và điều này được giải thích trong một trong những câu trả lời dài hơn dưới đây. stackoverflow.com/a/40062505/3281336
PatS

1
Lùi lại là một trò lố bịch, bởi vì không có giọng nghiêm trọng phía trước - đó được gọi là giọng cấp tính
Walter Tross

Câu trả lời:


296

Đây là một tính năng được gọi là mẫu chữ .

Chúng được gọi là "chuỗi mẫu" trong các phiên bản trước của đặc tả ECMAScript 2015.

Các mẫu chữ được hỗ trợ bởi Firefox 34, Chrome 41 và Edge 12 trở lên, nhưng không phải bởi Internet Explorer.

Chữ mẫu có thể được sử dụng để biểu diễn các chuỗi nhiều dòng và có thể sử dụng "nội suy" để chèn các biến:

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

Đầu ra:

---
   a is: 123
---

Điều quan trọng hơn, chúng có thể chứa không chỉ một tên biến, mà bất kỳ biểu thức JavaScript nào:

var a = 3, b = 3.1415;

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

2
Có bất kỳ polyfils khả thi nào cho việc này do thiếu sự hỗ trợ cho nó không?
Alexander Dixon

3
@AlexanderDixon, không bạn không thể hoàn thiện tính năng ngôn ngữ này theo nghĩa cổ điển, mặc dù bạn có thể sử dụng các mẫu từ Underscore hoặc lodash cho các biến trong chuỗi kết hợp với chuỗi đa biến bằng mảng : ["a", "b"].join(""); // both string elements written in new lines. Nhưng ngoài việc này, người ta có thể sử dụng một "bộ chuyển mã" như Babel để chuyển đổi ES6 + sang ES5
thử-bắt-cuối-

2
Tagged mẫu chữ bằng cách sử dụng backticks! Điều này là hợp lệ và hoạt động tốt :alert`1`.
Toàn cảnh

@UnionP Được hỗ trợ bởi tất cả các trình duyệt chính bao gồm MS Edge: kangax.github.io/compat-table/es6/#test-template_literals
Jonathan Cross

2
@kiki có vẻ như ngôn ngữ kịch bản là một biến thể của ECMAScript. Các tập lệnh ứng dụng Google không hỗ trợ các tính năng ECMAScript 2015 rõ ràng. Tôi không thể tìm thấy thông số kỹ thuật chính thức về ngôn ngữ họ đang sử dụng.
thử bắt cuối cùng vào

162

ECMAScript 6 đưa ra một loại chuỗi ký tự mới, sử dụng backtick làm dấu phân cách. Những chữ này cho phép các biểu thức nội suy chuỗi cơ bản được nhúng, sau đó được tự động phân tích và đánh giá.

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

Như bạn có thể thấy, chúng tôi đã sử dụng `xung quanh một loạt các ký tự, được hiểu là một chuỗi ký tự, nhưng bất kỳ biểu thức nào của biểu mẫu ${..}đều được phân tích cú pháp và đánh giá nội tuyến ngay lập tức.

Một lợi ích thực sự tốt đẹp của chuỗi ký tự nội suy là chúng được phép chia thành nhiều dòng:

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!

Biểu hiện nội suy

Bất kỳ biểu thức hợp lệ nào cũng được phép xuất hiện bên ${..}trong một chuỗi ký tự được nội suy, bao gồm các lệnh gọi hàm, các lệnh gọi biểu thức hàm nội tuyến và thậm chí các chuỗi ký tự được nội suy khác!

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!

Ở đây, `${who}s`chuỗi ký tự nội suy bên trong là một chút thuận tiện hơn cho chúng ta khi kết hợp whobiến với "s"chuỗi, trái ngược với who + "s". Ngoài ra, để ghi chú là một chuỗi ký tự được nội suy chỉ nằm trong phạm vi từ vựng, nơi nó xuất hiện, không được tự động trong phạm vi:

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!"

Sử dụng mẫu bằng chữ cho HTML chắc chắn dễ đọc hơn bằng cách giảm bớt sự khó chịu.

Cách cũ đơn giản:

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

Với ECMAScript 6:

`<div class="${className}">
  <p>${content}</p>
  <a href="${link}">Let's go</a>
</div>`
  • Chuỗi của bạn có thể trải dài trên nhiều dòng.
  • Bạn không phải thoát các ký tự trích dẫn.
  • Bạn có thể tránh các nhóm như: '">'
  • Bạn không phải sử dụng toán tử cộng.

Tagged Mẫu chữ

Chúng ta cũng có thể gắn thẻ một chuỗi mẫu, khi một chuỗi mẫu được gắn thẻ, các chữ và thay thế được truyền cho hàm trả về giá trị kết quả.

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

Chúng ta có thể sử dụng toán tử trải rộng ở đây để truyền nhiều giá trị. Đối số đầu tiên, chúng tôi gọi nó là chuỗi Chuỗi là một mảng gồm tất cả các chuỗi đơn giản (thứ nằm giữa bất kỳ biểu thức nội suy nào).

Sau đó chúng tôi thu thập tất cả đối số tiếp theo vào một mảng gọi là giá trị sử dụng ... gather/rest operator, mặc dù bạn có thể tất nhiên đã để lại cho họ như các thông số tên cá nhân sau khi chuỗi tham số như chúng tôi đã làm ở trên ( value1, value2, vv).

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

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

(Các) đối số được tập hợp vào mảng giá trị của chúng tôi là kết quả của các biểu thức nội suy đã được đánh giá được tìm thấy trong chuỗi ký tự. Một chuỗi ký tự được gắn thẻ giống như một bước xử lý sau khi các phép nội suy được ước tính, nhưng trước khi giá trị chuỗi cuối cùng được biên dịch, cho phép bạn kiểm soát nhiều hơn trong việc tạo chuỗi từ chữ. Hãy xem xét một ví dụ về việc tạo các mẫu có thể tái sử dụng.

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

Chuỗi thô

Các hàm thẻ của chúng tôi nhận được một đối số đầu tiên mà chúng tôi gọi là các chuỗi, đó là một mảng. Nhưng có thêm một chút dữ liệu bao gồm: các phiên bản chưa xử lý thô của tất cả các chuỗi. Bạn có thể truy cập các giá trị chuỗi thô đó bằng cách sử dụng thuộc .rawtính, như thế này:

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

Như bạn có thể thấy, phiên bản thô của chuỗi bảo tồn chuỗi đã thoát \n, trong khi phiên bản được xử lý của chuỗi xử lý nó như một dòng mới thực sự không được giải mã. ECMAScript 6 đi kèm với chức năng tích hợp có thể được sử dụng làm thẻ chuỗi ký tự : String.raw(..). Nó chỉ đơn giản là đi qua các phiên bản thô của chuỗi:

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

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

1
Câu trả lời chính xác! Nhận xét nhỏ, trong phần Văn bản mẫu được gắn thẻ của bạn, tôi tin rằng hai kết quả đầu ra mảng ví dụ myTaggedLiteral`test ${someText} ${2 + 3}`;phải là //["test ", " "](tức là không cắt bớt chuỗi).
Michael Krebs

3
Cuộn xuống để xem tài khoản của tác giả, đã không thất vọng! Lời giải thích hay. xD
varun

Giải thích tốt và bảo hiểm rộng, cảm ơn bạn. Chỉ muốn thêm rằng đó cũng là một cái nhìn tổng quan tốt về trang web mẫu của nhà phát triển Mozilla (các chuỗi mẫu) bao gồm một số khía cạnh bổ sung.
Dev Ops

1
Nit: "ECMAScript 6 đưa ra một loại chuỗi ký tự mới" Đây không phải là một chuỗi ký tự, nó là một mẫu chữ. Nó dẫn đến một chuỗi khi được đánh giá nếu nó không được đánh dấu. Đây không chỉ là giáo điều, có những nơi bạn có thể sử dụng chuỗi ký tự mà không cho phép sử dụng các ký tự mẫu (như tên tham số không được tính toán, số nhận dạng mô-đun ...).
TJ Crowder

Câu bao gồm "là một chuỗi ký tự nội suy chỉ là phạm vi từ vựng" là không thể hiểu được. Bạn có thể sửa nó không?
Peter Mortensen

21

Backticks (` ) được sử dụng để xác định mẫu bằng chữ. Mẫu chữ là một tính năng mới trong ECMAScript 6 để giúp làm việc với các chuỗi dễ dàng hơn.

Đặc trưng:

  • chúng ta có thể nội suy bất kỳ loại biểu thức nào trong văn bản mẫu.
  • Chúng có thể là đa dòng.

Lưu ý: chúng ta có thể dễ dàng sử dụng dấu ngoặc đơn ( ') và dấu ngoặc kép ( ") bên trong backticks ( `).

Thí dụ:

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

Để nội suy các biến hoặc biểu thức chúng ta có thể sử dụng ${expression}ký hiệu cho điều đó.

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

Chuỗi nhiều dòng có nghĩa là bạn không còn phải sử dụng \ncho các dòng mới nữa.

Thí dụ:

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

Đầu ra:

Hello Rohit!
How are you?

15

Backticks bao gồm các mẫu chữ, trước đây được gọi là chuỗi mẫu. Mẫu chữ là các chuỗi ký tự cho phép các biểu thức nhúng và các tính năng nội suy chuỗi.

Chữ mẫu có các biểu thức được nhúng trong trình giữ chỗ, được biểu thị bằng ký hiệu đô la và dấu ngoặc nhọn xung quanh một biểu thức, nghĩa là ${expression}. Trình giữ chỗ / biểu thức được truyền vào một hàm. Hàm mặc định chỉ nối chuỗi.

Để thoát khỏi một backtick, đặt dấu gạch chéo ngược trước nó:

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

Sử dụng backticks để dễ dàng viết chuỗi nhiều dòng hơn:

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

hoặc là

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

so với JavaScript vani:

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

hoặc là

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

Trình tự thoát:

  • Thoát khỏi Unicode bắt đầu bằng \u, ví dụ\u00A9
  • \u{}Ví dụ, mã điểm Unicode được chỉ định bởi\u{2F804}
  • Thoát khỏi hệ thập lục phân bắt đầu bằng \x, ví dụ\xA9
  • \Ví dụ, thoát theo nghĩa đen bắt đầu bằng và (a) chữ số, ví dụ\251

10

Tóm lược:

Backticks trong JavaScript là một tính năng được giới thiệu trong ECMAScript 6 // ECMAScript 2015 để tạo các chuỗi động dễ dàng. Tính năng ECMAScript 6 này cũng được đặt tên theo chuỗi mẫu . Nó cung cấp các lợi thế sau khi so sánh với các chuỗi thông thường:

  • Trong các mẫu, các chuỗi ngắt được cho phép và do đó có thể là đa dòng. Chuỗi ký tự bình thường (khai báo bằng ''hoặc"" ) không được phép ngắt dòng.
  • Chúng ta có thể dễ dàng nội suy các giá trị biến thành chuỗi với ${myVariable}cú pháp.

Thí dụ:

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

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

console.log(story);

Tính tương thích của trình duyệt web:

Chuỗi ký tự mẫu được hỗ trợ bởi tất cả các nhà cung cấp trình duyệt lớn (trừ Internet Explorer). Vì vậy, nó là khá tiết kiệm để sử dụng trong mã sản xuất của bạn. Một danh sách chi tiết hơn về sự tương thích của trình duyệt có thể được tìm thấy ở đây .


10

Ngoài phép nội suy chuỗi, bạn cũng có thể gọi một hàm bằng cách sử dụng back-tick.


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

// To call this function using ``

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

// Or
sayHello`
    some args
`;

Kiểm tra thành phần theo kiểu . Họ sử dụng nó rất nhiều.


7

Phần tốt là chúng ta có thể thực hiện các phép toán cơ bản trực tiếp:

let nuts = 7

more.innerHTML = `

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

<hr>

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

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

Nó thực sự hữu ích trong một chức năng của nhà máy:

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
không ai khác cười khúc khích cmon bây giờ
StayCool
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.