Javascript thoát dấu ngoặc kép

Mẫu chữ là chữ được phân tách bằng ký tự backtick (

`\${1}` === "${1}"; // true
4), cho phép chuỗi nhiều dòng, phép nội suy chuỗi với biểu thức nhúng và cấu trúc đặc biệt được gọi là mẫu được gắn thẻ

Chữ mẫu đôi khi được gọi một cách không chính thức là chuỗi mẫu, bởi vì chúng được sử dụng phổ biến nhất cho phép nội suy chuỗi (để tạo chuỗi bằng cách thay thế các trình giữ chỗ). Tuy nhiên, một mẫu chữ được gắn thẻ có thể không dẫn đến một chuỗi;

cú pháp

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`

Thông số

`\${1}` === "${1}"; // true
5

Văn bản chuỗi sẽ trở thành một phần của mẫu chữ. Hầu như tất cả các ký tự đều được phép theo nghĩa đen, bao gồm ngắt dòng và các ký tự khoảng trắng khác. Tuy nhiên, các chuỗi thoát không hợp lệ sẽ gây ra lỗi cú pháp, trừ khi chức năng thẻ được sử dụng

`\${1}` === "${1}"; // true
6

Một biểu thức được chèn vào vị trí hiện tại, có giá trị được chuyển đổi thành một chuỗi hoặc được chuyển đến

`\${1}` === "${1}"; // true
7

`\${1}` === "${1}"; // true
7

Nếu được chỉ định, nó sẽ được gọi với mảng chuỗi mẫu và biểu thức thay thế, và giá trị trả về trở thành giá trị của chữ mẫu. Xem các mẫu được gắn thẻ

Sự miêu tả

Văn bản mẫu được đặt trong dấu gạch ngược (_______04) ký tự thay vì dấu ngoặc kép hoặc dấu ngoặc đơn

Cùng với việc có các chuỗi bình thường, các mẫu chữ cũng có thể chứa các phần khác được gọi là trình giữ chỗ, là các biểu thức nhúng được phân tách bằng ký hiệu đô la và dấu ngoặc nhọn.

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
0. Các chuỗi và trình giữ chỗ được chuyển đến một hàm — hàm mặc định hoặc hàm bạn cung cấp. Hàm mặc định (khi bạn không cung cấp hàm của riêng mình) chỉ thực hiện phép nội suy chuỗi để thay thế các trình giữ chỗ và sau đó nối các phần thành một chuỗi

Để cung cấp một chức năng của riêng bạn, hãy đặt trước mẫu chữ một tên chức năng; . Trong trường hợp đó, chữ mẫu được chuyển đến chức năng thẻ của bạn, sau đó bạn có thể thực hiện bất kỳ thao tác nào bạn muốn trên các phần khác nhau của chữ mẫu

Để thoát dấu gạch ngược trong mẫu chữ, hãy đặt dấu gạch chéo ngược (

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
1) trước dấu gạch ngược

`\`` === "`"; // true

Dấu hiệu đô la cũng có thể được thoát để ngăn nội suy

`\${1}` === "${1}"; // true

Chuỗi nhiều dòng

Bất kỳ ký tự dòng mới nào được chèn vào nguồn đều là một phần của mẫu chữ

Sử dụng các chuỗi bình thường, bạn sẽ phải sử dụng cú pháp sau để có được các chuỗi nhiều dòng

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

Sử dụng chữ mẫu, bạn có thể làm tương tự với điều này

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`
2

nội suy chuỗi

Nếu không có mẫu chữ, khi bạn muốn kết hợp đầu ra từ biểu thức với chuỗi, bạn sẽ nối chúng bằng toán tử cộng

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

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`
4

Điều đó có thể khó đọc – đặc biệt là khi bạn có nhiều biểu thức

Với mẫu chữ, bạn có thể tránh toán tử nối — và cải thiện khả năng đọc mã của bạn — bằng cách sử dụng trình giữ chỗ có dạng

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
0 để thực hiện thay thế cho các biểu thức được nhúng

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`
6

Lưu ý rằng có một sự khác biệt nhỏ giữa hai cú pháp. Các mẫu chữ ép buộc các biểu thức của chúng trực tiếp vào các chuỗi, trong khi phép cộng ép buộc các toán hạng của nó thành các nguyên hàm trước. Để biết thêm thông tin, hãy xem trang tham khảo cho toán tử

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

mẫu lồng nhau

Trong một số trường hợp nhất định, lồng mẫu là cách dễ nhất (và có lẽ dễ đọc hơn) để có các chuỗi có thể định cấu hình. Trong mẫu được phân cách bằng dấu gạch ngược, thật đơn giản để cho phép dấu gạch ngược bên trong bằng cách sử dụng chúng bên trong trình giữ chỗ

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
0 trong mẫu

Ví dụ: không có mẫu chữ, nếu bạn muốn trả về một giá trị nhất định dựa trên một điều kiện cụ thể, bạn có thể làm như sau

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`
9

Với một mẫu chữ nhưng không lồng nhau, bạn có thể làm điều này

`\${1}` === "${1}"; // true
0

Với việc lồng các chữ mẫu, bạn có thể làm điều này

`\${1}` === "${1}"; // true
1

mẫu được gắn thẻ

Một dạng văn bản mẫu nâng cao hơn là các mẫu được gắn thẻ

Các thẻ cho phép bạn phân tích các chữ mẫu bằng một hàm. Đối số đầu tiên của hàm thẻ chứa một mảng các giá trị chuỗi. Các đối số còn lại có liên quan đến các biểu thức

Sau đó, hàm thẻ có thể thực hiện bất kỳ thao tác nào trên các đối số này mà bạn muốn và trả về chuỗi đã thao tác. (Ngoài ra, nó có thể trả về một cái gì đó hoàn toàn khác, như được mô tả trong một trong các ví dụ sau. )

Tên của chức năng được sử dụng cho thẻ có thể là bất cứ điều gì bạn muốn

`\`` === "`"; // true
0

Thẻ không nhất thiết phải là một mã định danh đơn giản. Bạn có thể sử dụng bất kỳ biểu thức nào có mức độ ưu tiên lớn hơn 16, bao gồm quyền truy cập thuộc tính, lệnh gọi hàm, biểu thức mới hoặc thậm chí một ký tự mẫu được gắn thẻ khác

`\`` === "`"; // true
1

Mặc dù cú pháp cho phép về mặt kỹ thuật, các mẫu chữ không được gắn thẻ là các chuỗi và sẽ tạo ra một

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
6 khi được xâu chuỗi

`\`` === "`"; // true
2

Ngoại lệ duy nhất là chuỗi tùy chọn, sẽ gây ra lỗi cú pháp

`\`` === "`"; // true
3

Lưu ý rằng hai biểu thức này vẫn có thể phân tích cú pháp. Điều này có nghĩa là chúng sẽ không bị chèn dấu chấm phẩy tự động, mà sẽ chỉ chèn dấu chấm phẩy để sửa mã mà nếu không thì không thể phân tích cú pháp

`\`` === "`"; // true
4

Các hàm thẻ thậm chí không cần trả về một chuỗi

`\`` === "`"; // true
5

Đối số đầu tiên mà hàm thẻ nhận được là một mảng các chuỗi. Đối với bất kỳ mẫu chữ nào, độ dài của nó bằng số lần thay thế (lần xuất hiện của

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
7) cộng với một và do đó luôn không trống

Đối với bất kỳ biểu thức chữ cái mẫu được gắn thẻ cụ thể nào, hàm thẻ sẽ luôn được gọi với cùng một mảng chữ chính xác, bất kể chữ đó được đánh giá bao nhiêu lần

`\`` === "`"; // true
6

Điều này cho phép thẻ lưu trữ kết quả dựa trên danh tính của đối số đầu tiên của nó. Để đảm bảo hơn nữa tính ổn định của giá trị mảng, đối số đầu tiên và thuộc tính

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
8 của nó đều bị đóng băng, vì vậy bạn không thể thay đổi chúng theo bất kỳ cách nào

dây thô

Thuộc tính đặc biệt

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
8, có sẵn trên đối số đầu tiên của hàm thẻ, cho phép bạn truy cập các chuỗi thô khi chúng được nhập mà không cần xử lý các chuỗi thoát

`\`` === "`"; // true
7

Ngoài ra, phương thức

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`
20 tồn tại để tạo các chuỗi thô giống như hàm mẫu mặc định và phép nối chuỗi sẽ tạo ra

`\`` === "`"; // true
8

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`
21 có chức năng giống như thẻ "nhận dạng" nếu chữ không chứa bất kỳ chuỗi thoát nào. Trong trường hợp bạn muốn một thẻ nhận dạng thực tế luôn hoạt động như thể chữ không được gắn thẻ, bạn có thể tạo một chức năng tùy chỉnh vượt qua "đã nấu chín" (i. e. trình tự thoát được xử lý) mảng chữ thành
`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`
21, giả vờ rằng chúng là chuỗi thô

`\`` === "`"; // true
9

Điều này hữu ích cho nhiều công cụ xử lý đặc biệt các chữ được gắn thẻ theo một tên cụ thể

`\${1}` === "${1}"; // true
0

Các mẫu được gắn thẻ và trình tự thoát

Trong các mẫu chữ bình thường, tất cả các chuỗi thoát trong chuỗi ký tự đều được phép. Bất kỳ chuỗi thoát không đúng định dạng nào khác đều là lỗi cú pháp. Điêu nay bao gôm

  • console.log("string text line 1\n" + "string text line 2");
    // "string text line 1
    // string text line 2"
    
    1 theo sau bởi bất kỳ chữ số thập phân nào khác với
    `string text`
    
    `string text line 1
     string text line 2`
    
    `string text ${expression} string text`
    
    tagFunction`string text ${expression} string text`
    
    24, hoặc
    `string text`
    
    `string text line 1
     string text line 2`
    
    `string text ${expression} string text`
    
    tagFunction`string text ${expression} string text`
    
    25 theo sau bởi một chữ số thập phân;
  • `string text`
    
    `string text line 1
     string text line 2`
    
    `string text ${expression} string text`
    
    tagFunction`string text ${expression} string text`
    
    28 theo sau bởi ít hơn hai chữ số hex (bao gồm cả số không);
  • `string text`
    
    `string text line 1
     string text line 2`
    
    `string text ${expression} string text`
    
    tagFunction`string text ${expression} string text`
    
    40 không theo sau bởi
    `string text`
    
    `string text line 1
     string text line 2`
    
    `string text ${expression} string text`
    
    tagFunction`string text ${expression} string text`
    
    41 và theo sau là ít hơn bốn chữ số hex (bao gồm cả số không);
  • `string text`
    
    `string text line 1
     string text line 2`
    
    `string text ${expression} string text`
    
    tagFunction`string text ${expression} string text`
    
    43 kèm theo một điểm mã Unicode không hợp lệ — nó chứa một chữ số không phải hệ thập lục phân hoặc giá trị của nó lớn hơn
    `string text`
    
    `string text line 1
     string text line 2`
    
    `string text ${expression} string text`
    
    tagFunction`string text ${expression} string text`
    
    44;

Ghi chú.

console.log("string text line 1\n" + "string text line 2");
// "string text line 1
// string text line 2"
1 theo sau là các ký tự khác, mặc dù chúng có thể vô dụng vì không có gì được thoát, không phải là lỗi cú pháp

Tuy nhiên, đây là vấn đề đối với các mẫu được gắn thẻ, ngoài chữ "đã nấu chín", còn có quyền truy cập vào các chữ thô (các chuỗi thoát được giữ nguyên như hiện trạng)

Các mẫu được gắn thẻ sẽ cho phép nhúng các ngôn ngữ (ví dụ: DSL hoặc LaTeX), trong đó các chuỗi thoát khác là phổ biến. Do đó, hạn chế cú pháp của các chuỗi thoát đúng định dạng sẽ bị xóa khỏi các mẫu được gắn thẻ

`\${1}` === "${1}"; // true
1

Tuy nhiên, các chuỗi thoát bất hợp pháp vẫn phải được biểu diễn trong biểu diễn "nấu chín". Chúng sẽ hiển thị dưới dạng phần tử

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tagFunction`string text ${expression} string text`
48 trong mảng "đã nấu chín"

`\${1}` === "${1}"; // true
2

Lưu ý rằng hạn chế chuỗi thoát chỉ bị loại bỏ khỏi các mẫu được gắn thẻ chứ không phải từ các mẫu chữ không được gắn thẻ