JavaScript < ES5、ES6、ES7、… >ECMAScript 6

ES6模板字面量(3)

2018-11-21  本文已影响14人  CodeMT

前面的话


JS的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串、字符串格式化、HTML转义等。ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系,通过一些全新的方法来解决类似的问题。本文将详细介绍ES6模板字面量

基本用法

let message = `Hello world!`;
console.log(message); // "Hello world!"console.log(typeof message); //
"string"console.log(message.length);// 12

let message = `\`Hello\` world!`;
console.log(message); // "`Hello` world!"console.log(typeofmessage);//
"string"console.log(message.length);// 14

多行字符串

【反斜杠】

varmessage = "Multiline \
string";
console.log(message); // "Multiline string"

varmessage = "Multiline \n\
string";// "Multiline // string"console.log(message);

var message = ["Multiline ","string"].join("\n");
let message = "Multiline \n" +"string";

【反引号】

let message =`Multiline`
string`;// "Multiline// string"console.log(message);
console.log(message.length); // 16

let message = `Multiline string`;// "Multiline
// string"console.log(message);
console.log(message.length); //24

let html = `<div>
    <h1>Title</h1>
</div>`.trim();

let message =`Multiline\nstring`;
// "Multiline// string" console.log(message);
console.log(message.length); // 16

变量占位符

let name = "Nicholas",
message =`Hello, ${name}.`;
console.log(message); // "Hello, Nicholas."

let count = 10,
price = 0.25,
message = `${count} items cost $${(count * price).toFixed(2)}.`;
console.log(message); // "10 items cost $2.50."
function fn() { return"Hello World";
}
`foo ${fn()} bar`// foo Hello World bar

let name = "Nicholas",
message =`Hello, ${
        `my name is ${ name }`
}.`;
console.log(message); // "Hello, my name is Nicholas."

标签模板

let message = tag`Hello world`;

【定义标签】

function tag(literals, ...substitutions) { // 返回一个字符串}

let count = 10,
price = 0.25,
message = passthru`${count} items cost $${(count * price).toFixed(2)}.`;

function passthru(literals, ...substitutions) {
   let result = ""; // 仅使用 substitution 的元素数量来进行循环
   for(let i = 0; i < substitutions.length; i++) {
       result +=literals[i];
       result +=substitutions[i];
   } // 添加最后一个字面量
   result += literals[literals.length - 1]; return result;
}
let count = 10,
price = 0.25,
message = passthru`${count} items cost $${(count * price).toFixed(2)}.`;
console.log(message); // "10 items cost $2.50."

【应用】

var message =
   SaferHTML` ${sender} has sent you a message.`;function SaferHTML(templateData) { var s = templateData[0]; for(vari = 1; i<arguments.length; i++) { var arg = String(arguments[i]); // Escape special characters in the substitution.
s += arg.replace(/&/g, "&amp")
      .replace(/</g, "&lt")
      .replace(/>/g, "&gt"); // Don't escape special characters in the template.
     s +=templateData[i];
   } return s;
}

var sender = '<script>alert("abc")</script>'; // 恶意代码var message =
SaferHTML`<p>${sender} has sent you a message.</p>`;console.log(message);//
<p>&lt;script&gt;alert("abc")&lt;/script&gt; has sent you a message.</p>

i18n`Welcome to ${siteName}, you are visitor number ${visitorNumber}!`// "欢迎访问xxx,您是第xxxx位访问者!"

// 下面的hashTemplate函数// 是一个自定义的模板处理函数var libraryHtml = hashTemplate`
<ul>
    #for book in ${myBooks} <li><i>#{book.title}</i> by #{book.author}</li>
    #end </ul>
`;

raw()

let message1 =`Multiline\nstring`,
message2 =String.raw`Multiline\nstring`;
console.log(message1); // "Multiline// string"console.log(message2);// "Multiline\\nstring"
String.raw`Hi\n${2+3}!`;// "Hi\\n5!"String.raw`Hi\u000A!`;// 'Hi\\u000A!'

String.raw`Hi\\n`// "Hi\\n"

String.raw({ raw: 'test' }, 0, 1, 2);// 't0e1s2t'// 等同于String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2);

上一篇 下一篇

猜你喜欢

热点阅读