जावास्क्रिप्ट में backtick चरित्र (`) का उपयोग


277

जावास्क्रिप्ट में, एक बैकटिक एक भी बोली के रूप में ही काम करने के लिए लगता है। उदाहरण के लिए, मैं इस तरह से एक स्ट्रिंग को परिभाषित करने के लिए एक बैकटिक का उपयोग कर सकता हूं:

var s = `abc`;

क्या कोई ऐसा तरीका है जिसमें बैकटिक का व्यवहार वास्तव में एकल उद्धरण से भिन्न होता है?


† ध्यान दें कि प्रोग्रामर के बीच, "बैकटिक" एक ऐसा नाम है जिसे आम तौर पर गंभीर उच्चारण कहा जाता है । प्रोग्रामर भी कभी-कभी वैकल्पिक नामों का उपयोग "बैकवोट" और "बैकग्रेव" करते हैं। इसके अलावा, स्टैक ओवरफ्लो और अन्य जगहों पर, "बैकटिक" के लिए अन्य सामान्य वर्तनी "बैक-टिक" और "बैक टिक" हैं।


कृपया टैग किए गए टेम्प्लेट के उपयोग के लिए नीचे भी पढ़ें। यह सवाल पूछे जाने से अलग उपयोग है। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… और यह नीचे दिए गए लंबे उत्तरों में से एक में समझाया गया है। stackoverflow.com/a/40062505/3281336
15

1
"बैकग्रवे" हास्यास्पद है, क्योंकि आगे कोई गंभीर उच्चारण नहीं है - जिसे एक तीव्र उच्चारण कहा जाता है
वाल्टर ट्रॉस

जवाबों:


297

यह एक विशेषता है जिसे टेम्प्लेट शाब्दिक कहा जाता है

ECMAScript 2015 विनिर्देश के पूर्व संस्करणों में उन्हें "टेम्पलेट स्ट्रिंग्स" कहा गया था।

टेम्पलेट शाब्दिक फ़ायरफ़ॉक्स 34, क्रोम 41 और एज 12 और इसके बाद के संस्करण द्वारा समर्थित हैं, लेकिन इंटरनेट एक्सप्लोरर द्वारा नहीं।

टेम्प्लेट शाब्दिक का उपयोग मल्टी-लाइन स्ट्रिंग्स का प्रतिनिधित्व करने के लिए किया जा सकता है और चर डालने के लिए "इंटरपोलेशन" का उपयोग कर सकते हैं:

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

आउटपुट:

---
   a is: 123
---

क्या अधिक महत्वपूर्ण है, उनमें न केवल एक चर नाम हो सकता है, लेकिन कोई जावास्क्रिप्ट अभिव्यक्ति भी हो सकती है:

var a = 3, b = 3.1415;

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

2
क्या इसके लिए कोई व्यवहार्य पॉलीफ़िल हैं जो इसके लिए समर्थन की कमी को देखते हैं?
अलेक्जेंडर डिक्सन

3
@AlexanderDixon, नहीं, आप इस भाषा की विशेषता को शास्त्रीय अर्थों में पॉलीफ़िल नहीं कर सकते हैं, हालाँकि आप ऐरे के उपयोग से मल्टीलाइनिंग स्ट्रिंग्स के साथ संयोजन में वेरिएबल्स के लिए अंडरस्कोर या लॉश से टेम्पलेट का उपयोग कर सकते हैं ["a", "b"].join(""); // both string elements written in new lines:। लेकिन इसके अलावा कोई भी "ट्रांसपिलर" का उपयोग कर सकता है जैसे कि बैबेल को ES6 + को ES5 में बदलने के लिए
कोशिश-कैच-अंततः

2
टैग किए गए टेम्पलेट शाब्दिक backticks का उपयोग कर! यह मान्य है और अच्छी तरह से काम करता हैalert`1`:।
Константин Ван

MSU एज सहित सभी प्रमुख ब्राउज़रों द्वारा @UnionP समर्थित: kangax.github.io/compat-table/es6/#test-template_literals
जोनाथन क्रॉस

2
@kiki यह लगता है कि स्क्रिप्ट भाषा ECMAScript का एक प्रकार है। Google ऐप स्क्रिप्ट स्पष्ट रूप से ECMAScript 2015 सुविधाओं का समर्थन नहीं करती है। मैं एक आधिकारिक विनिर्देश नहीं खोज पा रहा था कि वे किस भाषा का उपयोग कर रहे हैं।
कोशिश पकड़ने के अंत में

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

जैसा कि आप देख सकते हैं, हमने `लगभग वर्णों की एक श्रृंखला का उपयोग किया है , जिनकी व्याख्या एक स्ट्रिंग शाब्दिक के रूप में की जाती है, लेकिन फॉर्म के किसी भी भाव को ${..}तुरंत इनलाइन किया जाता है और मूल्यांकन किया जाता है।

प्रक्षेपित स्ट्रिंग शाब्दिक का एक बहुत अच्छा लाभ यह है कि उन्हें कई लाइनों में विभाजित करने की अनुमति दी जाती है:

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
बहुत बढ़िया जवाब! लघु टिप्पणी, आपके टैग किए गए टेम्प्लेट साहित्य अनुभाग में, मेरा मानना ​​है कि दो उदाहरण सरणी आउटपुट myTaggedLiteral`test ${someText} ${2 + 3}`;होना चाहिए //["test ", " "](यानी ट्रिम नहीं किए गए स्ट्रिंग्स)।
माइकल क्रेब्स

3
लेखक के खाते को देखने के लिए नीचे स्क्रॉल किया गया, निराश नहीं हुआ! अच्छे खर्च। xD
वरुण

अच्छी व्याख्या और विस्तृत कवरेज, धन्यवाद। बस यह जोड़ना चाहता था कि मोज़िला डेवलपर साइट टेम्पलेट शाब्दिक (टेम्पलेट स्ट्रिंग्स) पर एक अच्छा अवलोकन भी है जो कुछ अतिरिक्त पहलुओं को शामिल करता है।
देव ऑप्स

1
Nit: "ECMAScript 6 एक नए प्रकार के स्ट्रिंग शाब्दिक के साथ आता है" यह एक स्ट्रिंग शाब्दिक नहीं है, यह एक टेम्पलेट शाब्दिक है। इसका मूल्यांकन एक स्ट्रिंग में होता है जब इसका मूल्यांकन किया जाता है। यह सिर्फ हठधर्मिता नहीं है, ऐसे स्थान हैं जहाँ आप स्ट्रिंग शाब्दिकों का उपयोग कर सकते हैं जहाँ टेम्पलेट शाब्दिकों की अनुमति नहीं है (जैसे कि असम्बद्ध पैरामीटर नाम, मॉड्यूल पहचानकर्ता ...)।
टीजे क्राउडर

वाक्य जिसमें "एक प्रक्षेपित स्ट्रिंग शाब्दिक है, सिर्फ शाब्दिक रूप से स्कोप किया गया है" समझ से बाहर है। क्या आप इसे ठीक कर सकते हैं?
पीटर मोर्टेंसन

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}.`);

बनाम वेनिला जावास्क्रिप्ट:

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

या

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

पलायन क्रम:

  • \uउदाहरण के लिए, यूनिकोड बचना शुरू हुआ\u00A9
  • \u{}मिसाल के तौर पर यूनिकोड कोड प्वाइंट से संकेत मिलता है\u{2F804}
  • \xउदाहरण के लिए, हेक्साडेसिमल पलायन शुरू हुआ\xA9
  • \उदाहरण के लिए, ऑक्टल शाब्दिक पलायन और (ए) अंकों से शुरू हुआ\251

10

सारांश:

जावास्क्रिप्ट में बैकटिक्स एक सुविधा है जिसे आसान गतिशील तार बनाने के लिए 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);

ब्राउज़र संगतता:

टेम्पलेट स्ट्रिंग शाब्दिक मूल रूप से सभी प्रमुख ब्राउज़र विक्रेताओं (इंटरनेट एक्सप्लोरर को छोड़कर) द्वारा समर्थित हैं। तो यह अपने उत्पादन कोड में उपयोग करने के लिए बहुत बचाने है। ब्राउज़र कॉम्पिटिशन की अधिक विस्तृत सूची यहां पाई जा सकती है


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>


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.