JavaScript'te backtick karakterinin (`) kullanımı


277

JavaScript'te, bir backtick tek bir alıntıyla aynı şekilde çalışır. Örneğin, böyle bir dize tanımlamak için bir backtick kullanabilirsiniz:

var s = `abc`;

Backtick'in davranışının gerçekte tek bir alıntıdan farklı bir yolu var mı?


† Programcılar arasında "backtick" in daha genel olarak mezar vurgusu olarak adlandırılan bir isim olduğunu unutmayın . Programcılar ayrıca bazen "backquote" ve "backgrave" alternatif adlarını kullanırlar . Ayrıca, Stack Overflow ve başka yerlerde, "backtick" için diğer yaygın yazımlar "back-tick" ve "back tick" tir.


Etiketli Şablonların kullanımı için lütfen aşağıyı okuyun. Bu, sorulan sorudan farklı bir kullanımdır. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/… Ve bu, aşağıdaki daha uzun cevaplardan birinde açıklanmaktadır. stackoverflow.com/a/40062505/3281336
PatS

1
“Backgrave” çok saçma, çünkü ileri bir aksan aksanı yok - buna akut aksan denir
Walter Tross

Yanıtlar:


297

Bu, şablon değişmezleri adı verilen bir özelliktir .

ECMAScript 2015 spesifikasyonunun önceki sürümlerinde bunlara "şablon dizeleri" adı verildi.

Şablon değişmezleri Firefox 34, Chrome 41 ve Edge 12 ve üstü tarafından desteklenir, ancak Internet Explorer tarafından desteklenmez.

Şablon değişmezleri çok satırlı dizeleri temsil etmek için kullanılabilir ve değişkenleri eklemek için "enterpolasyon" kullanabilir:

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

Çıktı:

---
   a is: 123
---

Daha da önemlisi, sadece değişken bir ad değil, herhangi bir JavaScript ifadesi içerebilirler:

var a = 3, b = 3.1415;

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

2
Bunun için destek eksikliği göz önüne alındığında, bunun için uygulanabilir polifiller var mı?
Alexander Dixon

3
Eğer şablonları kullanabilir olsa @AlexanderDixon, hayır, klasik anlamda bu dil özelliği polyfill edemez alt çizgi veya lodash dizileri kullanarak dizeleri multilining birlikte dizeleri değişkenleri için: ["a", "b"].join(""); // both string elements written in new lines. Ancak bunun dışında, ES6 + 'yı ES5'e dönüştürmek için Babel gibi bir "transpiler" kullanabilirsiniz
try-catch-nihayet

2
Backticks kullanarak etiket hazır şablonlar ! Bu geçerli ve iyi çalışıyor:alert`1`.
Константин Ван

@UnionP MS Edge dahil tüm önemli tarayıcılar tarafından desteklenir: kangax.github.io/compat-table/es6/#test-template_literals
Jonathan Cross

2
@kiki script dilinin ECMAScript'in bir varyantı olduğu anlaşılıyor. Google App komut dosyaları ECMAScript 2015 özelliklerini açıkça desteklemez. Hangi dili kullandıklarını resmi olarak belirleyemedim.
try-catch-nihayet

162

ECMAScript 6, sınırlayıcı olarak backtick'i kullanan yeni bir dize değişmezi türü ile gelir. Bu değişmez değerler, daha sonra otomatik olarak ayrıştırılan ve değerlendirilen temel dize enterpolasyon ifadelerinin gömülmesine izin verir.

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

Gördüğünüz `gibi, dizgi değişmezi olarak yorumlanan bir dizi karakteri kullandık , ancak formun herhangi bir ifadesi ${..}hemen satır içi ayrıştırılıp değerlendirildi.

Enterpolasyonlu dize değişmezlerinin gerçekten güzel bir yararı, birden çok satıra bölünmesine izin verilmesidir:

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!

Enterpolasyonlu İfadeler

Geçerli ${..}çağrıların, işlev çağrıları, satır içi işlev ifade çağrıları ve hatta diğer enterpolasyonlu dize hazır değerleri de dahil olmak üzere enterpolasyonlu bir dize değişmezinde görünmesine izin verilir !

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!

Burada, iç `${who}s`enterpolasyonlu dize değişmezi, whodeğişkeni "s"dize ile birleştirirken, aksine, bizim için biraz daha kolay oldu who + "s". Ayrıca bir not tutmak için enterpolasyonlu bir dize hazır bilgisi, göründüğü yerde sadece dinamik olarak kapsamlandırılır, herhangi bir şekilde dinamik olarak kapsamlandırılmaz:

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 için şablon değişmezini kullanmak, rahatsızlığı azaltarak kesinlikle daha okunabilir.

Düz eski yol:

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

ECMAScript 6 ile:

`<div class="${className}">
  <p>${content}</p>
  <a href="${link}">Let's go</a>
</div>`
  • Dizeniz birden çok satıra yayılabilir.
  • Tırnak karakterlerinden kaçmak zorunda değilsiniz.
  • '">' Gibi gruplamalardan kaçınabilirsiniz.
  • Artı operatörünü kullanmak zorunda değilsiniz.

Etiketli Şablon Değişmezleri

Bir şablon dizesini de etiketleyebiliriz, bir şablon dizesi etiketlendiğinde değişmez değerler ve ikameler sonuçta ortaya çıkan değeri döndüren işleve geçirilir.

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

Burada yayma işlecini birden çok değer iletmek için kullanabiliriz. İlk argüman - buna dizeler adını verdik - tüm düz dizelerin (enterpolasyonlu ifadeler arasındaki şeyler) bir dizisidir.

Sonra kullanarak bir dizi olarak adlandırılan değerlere sonraki tüm argümanları toplayıp ... gather/rest operatorkurs ait olabilir yukarıda yaptığımız gibi parametre dizeleri (şu bireysel adlandırılmış parametreleri olarak bunları bırakmış olsa value1, value2vs.).

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

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

Değerler dizimize toplanan bağımsız değişkenler, dizgi değişmezinde bulunan önceden değerlendirilmiş enterpolasyon ifadelerinin sonuçlarıdır. Etiketli dize hazır bilgisi, enterpolasyonlar değerlendirildikten sonra, ancak son dize değeri derlenmeden önce bir işlem adımı gibidir; bu, değişmez değerden dize oluşturma üzerinde daha fazla kontrol sahibi olmanızı sağlar. Yeniden kullanılabilir şablonlar oluşturma örneğine bakalım.

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

Ham Dizeler

Etiket işlevlerimiz, dizeler olarak adlandırdığımız bir dizi olan ilk argümanı alır. Ancak ek veri de var: tüm dizelerin ham işlenmemiş versiyonları. Bu ham dize değerlerine şu .rawözelliği kullanarak erişebilirsiniz :

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

Gördüğünüz gibi, dizenin ham sürümü kaçan \ndiziyi korurken, dizenin işlenmiş sürümü ona çıkışsız bir gerçek yeni satır gibi davranır. ECMAScript 6 dize etiketi olarak kullanılabilir yerleşik bir işleve sahiptir: String.raw(..). Sadece dizelerin ham sürümlerinden geçer:

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

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

1
Mükemmel cevap! Küçük yorum, Etiketli Şablon Değişmezleri bölümünde, iki örnek dizi çıktısının olması myTaggedLiteral`test ${someText} ${2 + 3}`;gerektiğine inanıyorum //["test ", " "](yani kesilmiş dizeler değil).
Michael Krebs

3
Yazarın hesabını görmek için aşağı kaydırılır, hayal kırıklığına uğratmadı! İyi açıklama. xD
varun

İyi açıklama ve geniş kapsama alanı, teşekkür ederim. Ayrıca, Mozilla geliştirici sitesinde Şablon eklentileri (Şablon dizeleri) hakkında bazı ekstra özellikleri kapsayan iyi bir genel bakış olduğunu eklemek istedim .
Dev Ops

1
Nit: "ECMAScript 6 yeni bir dize değişmezi türü ile geliyor" Bu bir dize değişmez değeri değil, bir şablon değişmez değeri. Etiketsiz ise değerlendirildiğinde bir dizeyle sonuçlanır. Bu sadece dogmatik değil, şablon değişmezlerine izin verilmeyen dize değişmezlerini kullanabileceğiniz yerler vardır (hesaplanmamış parametre adları, modül tanımlayıcıları ...).
TJ Crowder

İçeren cümle "sadece lexically odaklanan bir ara değerli dizgiyi" anlaşılmaz. Tamir edebilir misin?
Peter Mortensen

21

Backticks ( `) şablon değişmez değerlerini tanımlamak için kullanılır. Şablon değişmezleri, dizelerle çalışmayı kolaylaştırmak için ECMAScript 6'daki yeni bir özelliktir.

Özellikleri:

  • şablon değişmezlerinde her türlü ifadeyi enterpole edebiliriz.
  • Çok hatlı olabilirler.

Not: kolayca ters 'tırnak ( ") içinde tek tırnak ( ) ve çift tırnak ( `) kullanabilirsiniz.

Misal:

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

Değişkenleri veya ifadeyi enterpolasyonlamak ${expression}için bunun gösterimini kullanabiliriz .

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

Çok satırlı dizeler artık \nyeni satırlar için kullanmak zorunda olmadığınız anlamına gelir .

Misal:

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

Çıktı:

Hello Rohit!
How are you?

15

Backticks, daha önce şablon dizeleri olarak bilinen şablon değişmezlerini kapsar. Şablon değişmez değerleri, katıştırılmış ifadelere ve dize enterpolasyon özelliklerine izin veren dize değişmezleridir.

Şablon değişmezleri, dolar işareti ve bir ifadenin etrafındaki süslü parantezlerle gösterilen yer tutuculara gömülü ifadelere sahiptir ${expression}. Yer tutucu / ifadeler bir işleve aktarılır. Varsayılan işlev sadece dizeyi birleştirir.

Bir backtick'ten kaçmak için, önüne bir ters eğik çizgi koyun:

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

Çok satırlı dizeyi daha kolay yazmak için geri işaretlerini kullanın:

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

veya

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

vs. vanilya JavaScript:

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

veya

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

Kaçış dizileri:

  • \uÖrneğin, tarafından başlatılan Unicode kaçışları\u00A9
  • \u{}Örneğin gösterilen Unicode kod noktası kaçışları\u{2F804}
  • \xÖrneğin onaltılık kaçışlar\xA9
  • \Örneğin sekizli hazır bilgi kaçışları ve (a) basamak (lar) tarafından başlatılır\251

10

Özet:

JavaScript'teki Backticks, kolay dinamik dizeler yapmak için ECMAScript 6 // ECMAScript 2015'te tanıtılan bir özelliktir. Bu ECMAScript 6 özelliği, şablon dizesi hazır bilgisi olarak da adlandırılır . Normal dizelerle karşılaştırıldığında aşağıdaki avantajları sunar:

  • Şablon dizelerinde satır kesmelerine izin verilir ve bu nedenle çok satırlı olabilir. Normal dize değişmezlerinin ( ''veya ile bildirilen "") satır sonu karakteri olmasına izin verilmez.
  • Değişken değerlerini ${myVariable}sözdizimiyle dizeye kolayca enterpole edebiliriz .

Misal:

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

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

console.log(story);

Tarayıcı Uyumluluğu:

Şablon dizesi hazır bilgisi, tüm büyük tarayıcı satıcıları tarafından yerel olarak desteklenir (Internet Explorer hariç). Bu nedenle, üretim kodunuzda kullanmak oldukça tasarrufludur. Tarayıcı uyumluluklarının daha ayrıntılı bir listesini burada bulabilirsiniz .


10

Dize enterpolasyonunun yanı sıra, geri işaretini kullanarak da bir işlevi çağırabilirsiniz.


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

// To call this function using ``

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

// Or
sayHello`
    some args
`;

Tarz bileşenini kontrol edin . Ağır kullanıyorlar.


7

İyi kısmı, temel matematiği doğrudan yapabiliriz:

let nuts = 7

more.innerHTML = `

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

<hr>

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

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

Bir fabrika işlevinde gerçekten yararlı oldu:

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
başka kimse kıkırdamadı şimdi
StayCool
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.