การใช้อักขระ backtick (`) ใน JavaScript


277

ใน JavaScript backtick ดูเหมือนจะทำงานเหมือนกับคำพูดเดียว ตัวอย่างเช่นฉันสามารถใช้ backtick เพื่อกำหนดสตริงเช่นนี้

var s = `abc`;

มีวิธีการที่พฤติกรรมของ backtick จริง ๆ แตกต่างจากการอ้างอิงเดียวหรือไม่


†หมายเหตุว่าในหมู่โปรแกรมเมอร์ "backtick" เป็นหนึ่งในชื่อของสิ่งที่เรียกว่ามากขึ้นโดยทั่วไปสำเนียงหลุมฝังศพ โปรแกรมเมอร์บางครั้งใช้ชื่อสำรอง "backquote" และ "backgrave" นอกจากนี้ใน Stack Overflowและที่อื่น ๆ การสะกดทั่วไปอื่น ๆ สำหรับ "backtick" คือ "back-tick" และ "back tick"


โปรดอ่านด้านล่างสำหรับการใช้เทมเพลต Tagged เช่นกัน นี่คือการใช้งานที่แตกต่างจากคำถามที่ถูกถาม developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...... และนี่คือคำอธิบายที่มีคำตอบยาวกว่าด้านล่าง stackoverflow.com/a/40062505/3281336
PatS

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
มีโพลีฟิลที่มีศักยภาพสำหรับสิ่งนี้เนื่องจากขาดการสนับสนุนหรือไม่?
Alexander Dixon

3
@AlexanderDixon ไม่มีคุณไม่สามารถ Polyfill คุณลักษณะภาษานี้ในความรู้สึกคลาสสิกแม้ว่าคุณอาจใช้แม่แบบจากเน้นหรือlodashตัวแปรในสตริงร่วมกับ multilining ["a", "b"].join(""); // both string elements written in new linesสตริงใช้อาร์เรย์: แต่นอกเหนือจากนี้อาจใช้ "transpiler" เช่นBabelเพื่อแปลง ES6 + เป็น ES5
ลองจับได้ในที่สุด

2
แท็กแม่แบบตัวอักษรโดยใช้ backticks! alert`1`นี่คือที่ถูกต้องและทำงานได้ดี:
КонстантинВан

@UnionP สนับสนุนโดยเบราว์เซอร์หลักทั้งหมดรวมถึง MS Edge: kangax.github.io/compat-table/es6/#test-template_literals
Jonathan Cross

2
@kiki ดูเหมือนว่าภาษาสคริปต์จะแตกต่างจาก ECMAScript สคริปต์ของ Google App ไม่รองรับคุณสมบัติ ECMAScript 2015 อย่างชัดเจน ฉันไม่สามารถหาสเปคอย่างเป็นทางการว่าพวกเขากำลังใช้ภาษาอะไร
ลองจับได้ในที่สุด

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"นอกจากนี้เพื่อเก็บบันทึกเป็นตัวอักษรสตริง interpolated เป็นเพียงการกำหนดขอบเขตที่มันปรากฏไม่ขอบเขตแบบไดนามิกในทางใด ๆ :

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

อย่างที่คุณเห็นรุ่น raw ของสตริงรักษา\nลำดับescaped ในขณะที่รุ่นที่ประมวลผลของสตริงปฏิบัติกับมันเหมือนบรรทัดใหม่จริง unescaped ECMAScript 6 String.raw(..)มาพร้อมกับฟังก์ชั่นที่สามารถนำมาใช้เป็นตัวอักษรแท็กสตริง: มันเพียงแค่ผ่านรุ่น raw ของสตริง:

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

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

1
คำตอบที่ดี! ความคิดเห็นเล็กน้อยในส่วนของตัวอักษรเทมเพลตที่ติดแท็กของคุณฉันเชื่อว่าผลลัพธ์ตัวอย่างสองตัวอย่างสำหรับmyTaggedLiteral`test ${someText} ${2 + 3}`;ควรเป็น//["test ", " "](เช่นไม่ใช่สตริงที่ถูกตัด)
Michael Krebs

3
เลื่อนลงเพื่อดูบัญชีของผู้เขียนก็ไม่ผิดหวัง! คำอธิบายที่ดี xD
varun

คำอธิบายที่ดีและครอบคลุมมากขอบคุณ เพียงแค่ต้องการเพิ่มว่ายังมีภาพรวมที่ดีเกี่ยวกับตัวอักษร Mozilla แม่แบบไซต์(สตริงแม่แบบ)ซึ่งครอบคลุมถึงลักษณะพิเศษบางอย่าง
Dev Ops

1
Nit: "ECMAScript 6 เกิดขึ้นกับสตริงตัวอักษรชนิดใหม่"ไม่ใช่ตัวอักษรสตริง แต่เป็นเทมเพลตตัวอักษร มันส่งผลให้สตริงเมื่อประเมินถ้ามันไม่ได้แท็ก นี่ไม่ใช่แค่ความเชื่อมีสถานที่ที่คุณสามารถใช้ตัวอักษรสตริงที่ไม่อนุญาตให้ใช้ตัวอักษรแม่แบบ (เช่นชื่อพารามิเตอร์ที่ไม่ได้เข้ารหัสตัวระบุโมดูล ... )
TJ Crowder

ประโยคที่มี"เป็นตัวอักษรสตริง interpolated เป็นเพียงขอบเขตขอบเขต"ไม่สามารถเข้าใจได้ คุณซ่อมได้หรือไม่?
Peter Mortensen

21

Backticks ( `) ใช้เพื่อกำหนดตัวอักษรเทมเพลต เทมเพลตตัวอักษรเป็นคุณลักษณะใหม่ใน ECMAScript 6 เพื่อให้การทำงานกับสตริงง่ายขึ้น

คุณสมบัติ:

  • เราสามารถแก้ไขประเภทของการแสดงออกใด ๆ ในตัวอักษรแม่แบบ
  • พวกเขาสามารถหลายบรรทัด

หมายเหตุ:เราสามารถใช้เครื่องหมายคำพูดเดี่ยว ( ') และเครื่องหมายคำพูดคู่ ( ") อย่างง่ายดายภายใน backticks ( `)

ตัวอย่าง:

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

Backticks ใส่ตัวอักษรเทมเพลตซึ่งรู้จักกันก่อนหน้านี้เป็นสตริงเทมเพลต เทมเพลตตัวอักษรเป็นตัวอักษรสตริงที่อนุญาตให้มีการแสดงออกที่ฝังตัวและคุณสมบัติการแก้ไขสตริง

เทมเพลตตัวอักษรมีนิพจน์ที่ฝังอยู่ในตัวยึดตำแหน่งแสดงด้วยเครื่องหมายดอลลาร์และวงเล็บปีกกาที่มีการแสดงออกเช่น ${expression}ตัวอักษรแม่แบบมีการแสดงออกที่ฝังอยู่ในตัวยึดแทนด้วยเครื่องหมายดอลลาร์และวงเล็บปีกการอบการแสดงออกเช่นตัวยึด / นิพจน์ได้รับการส่งผ่านไปยังฟังก์ชัน ฟังก์ชั่นเริ่มต้นเพียงแค่เชื่อมสตริง

หากต้องการหลีกเลี่ยง backtick ให้ใส่แบ็กสแลชก่อน:

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

ใช้ backticks เพื่อเขียนสตริงหลายบรรทัดได้ง่ายขึ้น:

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

หรือ

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

กับวานิลลาจาวาสคริปต์:

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

หรือ

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

ลำดับหนี:

  • \uตัวอย่างเช่นUnicode escapes เริ่มต้นโดย\u00A9
  • \u{}ยกตัวอย่างเช่นจุดโค้ด Unicode ที่ระบุโดย\u{2F804}
  • \xยกตัวอย่างเช่นเลขฐานสิบหกเริ่มต้นโดย\xA9
  • \ยกตัวอย่างเช่นตัวอักษรแปดตัวเริ่มต้นด้วยและ (ก) หลัก\251

10

สรุป:

Backticks ใน JavaScript เป็นคุณสมบัติที่นำมาใช้ใน ECMAScript 6 // ECMAScript 2015 สำหรับการสร้างสตริงแบบไดนามิกได้ง่าย ECMAScript 6 คุณลักษณะนี้ยังเป็นชื่อแม่แบบสตริงตัวอักษร มันมีข้อดีดังต่อไปนี้เมื่อเปรียบเทียบกับสตริงปกติ:

  • ในการอนุญาตให้ใช้ linebreaks ของสตริงเทมเพลตและสามารถเป็นหลายบรรทัดได้ ตัวอักษรสตริงปกติ (ประกาศด้วย''หรือ"" ) ไม่ได้รับอนุญาตให้มีการแบ่งบรรทัด
  • เราสามารถสอดแทรกค่าตัวแปรกับสตริงด้วย${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
ทำคนอื่นหัวเราะ Cmon ตอนนี้
StayCool
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.