JavaScript 中反引号字符 (') 的用法

Usage of the backtick character (`) in JavaScript

提问人:vancewang 提问时间:12/28/2014 最后编辑:Peter Mortensenvancewang 更新时间:2/12/2023 访问量:419271

问:

在 JavaScript 中,反引号 似乎与单引号相同。例如,我可以使用反引号来定义一个字符串,如下所示:

var s = `abc`;

有没有一种方式使反引号的行为实际上与单个引号的行为不同?


† 请注意,在程序员中,“反引号”是更普遍地称为重音的一个名称。程序员有时也会使用替代名称“backquote”和“backgrave”。此外,在 Stack Overflow 和其他地方,“反引号”的其他常见拼写是“反引号”和“反引号”。

JavaScript 模板字符串 引号

评论

2赞 PatS 8/6/2019
请阅读下文,了解标记模板的用法。这与所提出的问题不同。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/......这在下面的一个较长的答案中得到了解释。stackoverflow.com/a/40062505/3281336
24赞 Walter Tross 2/19/2020
“Backgrave”是荒谬的,因为没有前重音——这被称为急性重音
1赞 david.pfx 9/4/2022
@WalterTross:我同意。这个角色的正确名称是“grave”或“grave accent”。许多经常被错误命名的人之一。
5赞 Peter Mortensen 10/19/2022
来自反引号:“反引号”是主要用于计算的印刷标记。它也被称为反引号、重音或重音。

答:

450赞 14 revs, 9 users 51%try-catch-finally #1

这是一项称为模板文本的功能

在 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 7/8/2016
鉴于缺乏支持,是否有任何可行的多丝片?
4赞 try-catch-finally 7/8/2016
@AlexanderDixon,不,你不能在经典意义上对这种语言功能进行 polyfill,尽管你可以将 Underscorelodash 中的模板用于字符串中的变量,并使用数组对字符串进行多行分析: .但除此之外,人们可能会使用像 Babel 这样的“转译器”将 ES6+ 转换为 ES5["a", "b"].join(""); // both string elements written in new lines
4赞 Константин Ван 7/30/2016
使用反引号标记模板文字!这是有效的,并且效果很好:。alert`1`
0赞 Jonathan Cross 8/7/2018
@UnionP 支持包括 MS Edge 在内的所有主流浏览器:kangax.github.io/compat-table/es6/#test-template_literals
3赞 try-catch-finally 3/30/2019
@kiki看起来脚本语言是 ECMAScript 的变体。Google App 脚本显然不支持 ECMAScript 2015 功能。我无法找到他们使用什么语言的官方规范。
272赞 Thalaivar 10/16/2016 #2

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 like RajiniKanth
// 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"

例如,下面:一个 name 变量入定义 template-literal 的作用域中保存的值;在 foo 函数的作用域中分配另一个值将不起作用)

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

我们可以在这里使用点差运算符来传递多个值。第一个参数(我们称之为字符串)是所有纯字符串(任何插值表达式之间的内容)的数组。

然后,我们使用 将所有后续参数收集到一个名为 values 的数组中,尽管您当然可以将它们保留为字符串参数后面的单个命名参数,就像我们上面所做的那样(、 等)。... gather/rest operatorvalue1value2

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

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

收集到我们的 values 数组中的参数是在字符串文字中找到的已计算的插值表达式的结果。标记的字符串文本类似于在计算插值之后但在编译最终字符串值之前的处理步骤,从而可以更好地控制从文本生成字符串。让我们看一个创建可重用模板的示例。

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

如您所见,字符串的原始版本保留了转义序列,而字符串的处理版本将其视为未转义的真实换行符。ECMAScript 6 带有一个内置函数,可以用作字符串文字标签: .它只是通过字符串的原始版本:\nString.raw(..)

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

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

评论

2赞 Michael Krebs 2/11/2017
很好的答案!小评论,在您的标记模板文字部分,我相信两个示例数组输出应该是(即未修剪的字符串)。myTaggedLiteral`test ${someText} ${2 + 3}`;//["test ", " "]
2赞 Dev Ops 4/10/2019
很好的解释和广泛的覆盖面,谢谢。只是想补充一点,Mozilla开发者网站模板文字(模板字符串)上也有一个很好的概述,它涵盖了一些额外的方面。
2赞 T.J. Crowder 8/6/2019
Nit: “ECMAScript 6 提出了一种新型的字符串文字” 它不是字符串文字,而是模板文字。如果字符串未标记,则在评估时会生成一个字符串。这不仅仅是教条式的,有些地方可以使用不允许使用模板文字的字符串文字(例如未计算的参数名称、模块标识符......
1赞 Peter Mortensen 2/29/2020
包含“是插值字符串文字只是在词法范围内”的句子是不可理解的。你能解决它吗?
0赞 Kamafeather 11/30/2022
@PeterMortensen它不容易理解,但这是要使用的术语。– 但是,我在示例代码上方添加了一个注释;希望范围行为现在更清晰了。
33赞 Rohìt Jíndal 11/11/2016 #3

反引号 () 用于定义模板文字。模板文字是 ECMAScript 6 中的一项新功能,它使处理字符串变得更加容易。`

特征:

  • 我们可以在模板文字中插入任何类型的表达式。
  • 它们可以是多行的。

注意:我们可以轻松地在反引号 () 中使用单引号 () 和双引号 ()。'"`

例:

var nameStr = `I'm "Alpha" Beta`;

要插入变量或表达式,我们可以使用符号。${expression}

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

多行字符串意味着您不再需要用于新行。\n

例:

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

输出:

Hello Alpha!
How are you?
17赞 mrmaclean89 9/9/2017 #4

反引号将模板文本(以前称为模板字符串)括起来。模板文本是允许嵌入表达式和字符串插值功能的字符串文本。

模板文字在占位符中嵌入了表达式,用美元符号和表达式周围的大括号表示,即 .占位符/表达式被传递给函数。默认函数只是连接字符串。${expression}

要转义反引号,请在其前加上一个反斜杠:

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

使用反引号可以更轻松地编写多行字符串:

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

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

与 vanilla JavaScript:

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

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

转义序列:

  • Unicode 转义由 ,例如\u\u00A9
  • Unicode 码位转义由 表示,例如\u{}\u{2F804}
  • 例如,以 开头的十六进制转义\x\xA9
  • 例如,以 和 (a) 数字开头的八进制文字转义\\251
16赞 Willem van der Veen 10/3/2018 #5

总结:

JavaScript 中的反引号是 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);

浏览器兼容性:

所有主要浏览器供应商(Internet Explorer 除外)都本机支持模板字符串文本。因此,在生产代码中使用是非常安全的。可以在此处找到更详细的浏览器兼容性列表。

8赞 NVRM 1/22/2019 #6

好的部分是我们可以直接进行基本数学运算:

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>

评论

5赞 StayCool 6/3/2019
现在没有其他人笑了吗
20赞 Ankit Kumar 8/7/2019 #7

除了字符串插值之外,还可以使用反引号调用函数。


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

// To call this function using ``

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

// Or
sayHello`
    some args
`;

检查样式化的组件。他们大量使用它。

0赞 R Holmes 10/16/2020 #8

这是一个非常有用的功能,例如,这里有一个 Node.js 代码片段,用于测试 3 秒计时函数的设置。

const waitTime = 3000;
console.log(`setting a ${waitTime/1000} second delay`);

解释

  1. 将等待时间声明为 3000
  2. 使用反引号,您可以将“等待时间”除以 1000 的计算结果嵌入到所选文本的同一行中。
  3. 使用“waitTime”常量进一步调用计时器函数将导致 3 秒延迟,如 console.log 参数中计算的那样。
0赞 Sándor Krisztián 11/3/2020 #9

您也可以制作模板的模板,并达到私有变量。

var a= {e:10, gy:'sfdsad'}; //global object

console.log(`e is ${a.e} and gy is ${a.gy}`); 
//e is 10 and gy is sfdsad

var b = "e is ${a.e} and gy is ${a.gy}" // template string
console.log( `${b}` );
//e is ${a.e} and gy is ${a.gy}

console.log( eval(`\`${b}\``) ); // convert template string to template
//e is 10 and gy is sfdsad

backtick( b );   // use fonction's variable
//e is 20 and gy is fghj

function backtick( temp ) {
  var a= {e:20, gy:'fghj'}; // local object
  console.log( eval(`\`${temp}\``) );
}
1赞 cheriejw 12/15/2020 #10

很多评论回答了您的大部分问题,但我主要想为这个问题做出贡献:

有没有一种方式使反引号的行为实际上与单个引号的行为不同?

我注意到模板字符串的一个区别是无法将模板字符串设置为对象属性。更多信息在这篇文章中;公认答案中的一句有趣的话:

模板字符串是表达式,而不是文本1。

但基本上,如果你想将它用作对象属性,你必须使用它,并用方括号括起来。

// Throws error
const object = {`templateString`: true};

// Works
const object = {[`templateString`]: true};
2赞 Akila Dilan Md 2/12/2023 #11

反引号字符 ()* 字符,而不是单引号 (') 或双引号 (“)。) *in JavaScript is used to define template literals. A template literal is a special type of string that allows you to embed expressions, which are evaluated and included in the final string. They are denoted by being surrounded by the backtick (

下面是使用模板文本在字符串中嵌入表达式的示例:

const name = "Akila";
const message = `Hello, ${name}!`;
console.log(message); // Output: Hello, Akila!

在上面的示例中,表达式被计算并包含在最终字符串中,该字符串被分配给消息变量。${name}

模板文本还提供了一些方便的功能,例如多行字符串和字符串插值。多行字符串允许您在字符串中包含换行符,这对于创建格式化文本特别有用。

下面是将多行字符串与模板文本一起使用的示例:

const message = `This is a

多行字符串。 控制台.log(消息);

输出 这是一个 多行字符串。总之,JavaScript 中的反引号字符 (') 用于定义模板文字,这是在 JavaScript 代码中包含表达式和多行字符串的便捷方法。

评论

0赞 Moritz Ringler 2/16/2023
这如何增加已经提供的答案?
0赞 Akila Dilan Md 2/17/2023
我的意思是提到 JavaScript 中反引号字符 (') 的用法