alert`1`

为什么这个Payload中可以用反引号代替括号。


ES2015规范的先前版本中被称为模板字符串

允许嵌入表达式的字符串字面量。可以使用多行字符串和字符串插值功能。

模板字符串的诞生极大的方便了字符串的拼接,可以认为是一种字符串拼接方法。

模板字符串使用反引号来代替普通字符串中的单引号和双引号。

模板字符串使用 ${expression}作为占位符。

如果一个模板字符串由一个函数名开头,则该字符串被称为带标签的模板字符串,函数会在模板字符串处理后被调用。

模板字符串的一些用途


普通字符串

`string text`

多行字符串

`string text line 1
 string text line 2`

在输出多行字符串时,空白字符会被保留,原样输出。

字符串插值

`string text ${expression} string text`
`你好,我是 ${233 + 1}!` // => 你好,我是 234!
demo = 'TEag1e';
`你好,我是 ${demo} !` // => 你好,我是 TEag1e !

带标签的模板字符串

tag `string text ${expression} string text`

该标签通常是一个函数,它会在模板字符串处理结束后被调用。

需要注意的是,标签函数的第一个参数是一个包含字符串的数组。标签的第二个参数是第一个表达式的值,第三个参数是第二个表达式的值。

function tag(string, exp){}
tag`Hello ${expression} World `

上面这种情况,string参数是一个数组,数组第一个元素是 Hello ,第二个元素是World,exp参数则是 expression的结果。

String.raw()

String.raw方法用来充当模板字符串的处理函数,返回模板字符串最终的处理结果的原生形式。

demo = 123;
String.raw`你好,结果是:\n${demo + 123}`;
// => 你好,结果是:\n246

`你好,结果是:\n${demo + 123}`;
// => 你好结果是:
// 236

相关文档

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/template_strings