字符串模板引擎html
ES5中的字符串缺少多行字符串、字符串格式化、HTML转义等特性。数组
而ES6经过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系,经过一些全新的方法来浏览器
解决问题。app
1.基本用法
ES5字符串写法:iphone
let message = "个人宠物狗叫黑子,今年16岁了"
将其转化成ES6写法,其实很是简单:函数
只需把最外围的双引号(")或者单引号(') 转化成反引号(`)便可。url
let message = `个人宠物狗叫黑子,今年16岁了`
若是想在字符串内部使用反引号,只需使用反斜杠( )转义便可spa
let message = `个人宠物狗叫\`黑子\`,今年16岁了`; console.log(message); // "个人宠物狗叫`黑子`,今年16岁了"
2.多行字符串3d
传统的JavaScript语言,输出模板一般是这样写的:code
var name = '黑子'; var age = 8; $('#result').append( '个人宠物狗叫 <b>' + name + '</b>\n' + '今年\n' + '<em>' + age+ '</em>岁,\n'+ '十分可爱!' );
可是在ES6中,要得到一样效果的多行字符串,只需使用以下代码:
let name = '黑子'; let age = 8; $('#result').append( `个人宠物狗叫 <b>${name}</b> 今年 <em>${age}</em>岁, 十分可爱!` );
对比两段拼接的代码,模板字符串使得咱们再也不须要反复使用双引号(或者单引号)了;而是改用反引号标识符
(`),插入变量的时候也不须要再使用加号(+)了,而是把变量放入${ }便可。
也不用再经过写 n 进行换行了,ES6 的模板字面量使多行字符串更易建立,由于它不须要特殊的语法,只需在想
要的位置直接换行便可,此处的换行会同步出如今结果中。简单、清晰、明了。
注意:若是使用模板字符串表示多行字符串,全部的空格和缩进都会被保留在输出之中。所以须要特别留意缩进。
console.log(`个人宠物狗叫黑子 今年16岁了`); 结果: //个人宠物狗叫黑子 // 今年16岁了
以上代码中,模板字面量第二行前面的全部空白符都被视为字符串自身的一部分。
若是必定要经过适当的缩进来对齐文本,能够考虑在多行模板字面量的第一行空置并在后面的几行缩进
let html = ` <div> <h1>Title</h1> </div>`.trim();
以上代码中,模板字面量的第一行没有任何文本,第二行才有内容。 HTML标签的缩进加强了可读性,以后再
调用trim()方法移除了起始的空行。
3.字符串中嵌入变量
模板字面量看上去仅仅是普通JS字符串的升级版,但两者之间真正的区别在于模板字面量的变量占位符。
ES5写法:
const age = 8; const message = '个人宠物狗叫黑子,今年' + age*2 + '岁了' ; //个人宠物狗叫黑子,今年16岁了
ES6写法:
const age = 8; const message = `个人宠物狗叫黑子,今年 ${age*2} 岁了` ; //个人宠物狗叫黑子,今年16岁了
变量占位符容许将任何有效的JS表达式嵌入到模板字面量中,并将其结果输出为字符串的一部分。
如上面的例子,占位符 ${age} 会访问变量 age,并将其值插入到 message 字符串中。
既然占位符是JS表达式,还能够轻易嵌入运算符、函数调用等。
const age = 8; const message = `个人宠物狗叫黑子,今年 ${(age*2).toFixed(2)} 岁了`; //"个人宠物狗叫黑子,今年 16.00 岁了" function fn() { return "小黄"; } `我朋友家的宠物叫${fn()}` //"我朋友家的宠物叫小黄"
4.带标签的模板字符串
要用 ES6 模板实现复杂一点的字符串处理逻辑,要依赖写函数来实现。
幸运的是,除了在模板的插值表达式里想办法调用各类字符串转换的函数以外,ES6 还提供了更加优雅且更
容易复用的方案——带标签的模板字面量(tagged template literals,如下简称标签模板)
标签模板的语法很简单,就是在模板字符串的起始反撇号前加上一个标签。 let message = tag`黑子`;
在上面的代码中,tag就是模板标签。tag实际上是一个函数,这个函数会被调用来处理这个模板字符串。
4.1 定义标签
let name = '黑子', age = 8, message = tag`个人宠物狗叫${name},今年${age}岁了`; function tag(stringArr, value1, value2) { console.log(stringArr); //["个人宠物狗叫", ",今年", "岁了", raw: Array(3)] //该数组有一个raw属性,保存的是转义后的原字符串 console.log(value1); // 黑子 console.log(value2); // 8 return; }
标签函数一般使用不定参数特性来定义占位符,从而简化数据处理的过程
function tag(stringArr, ...values) { console.log(values); // ["黑子", 8] }
4.2 实际应用
“标签模板”的一个重要应用,就是过滤HTML字符串,防止用户输入恶意内容
var message = filterHTML`<p>${sender} 你好啊</p>`; function filterHTML(templateData) { var s = templateData[0]; for (var i = 1; i < arguments.length; i++) { var arg = String(arguments[i]); // 转义占位符中的特殊字符。 s += arg.replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">"); // 不转义模板中的特殊字符。 s += templateData[i]; } return s; }
上面代码中,sender变量每每是用户提供的,通过filterHTML函数处理,里面的特殊字符都会被转义。
var sender = '<script>alert("买了个包")</script>'; // 恶意代码 var message = filterHTML`<p>${sender} 你好啊</p>`; console.log(message); // <p><script>alert("买了个包")</script> 你好啊</p>
即便一个恶意命名的用户,例如黑客向其余用户发送一条骚扰信息,不管如何这条信息都会被转义为普通字符串,
其余用户不会受到潜在攻击的威胁。
标签模板的另外一个应用,就是多语言转换(国际化处理)
let name = 'ES6专栏 '; let number = 666; let chinese = ['欢迎访问','您是第','位访问者']; i18n`Welcome to ${name}, you are the ${number} visitor`; function i18n(stringArr, ...values){ let str=''; stringArr.map((item,index)=>{ str += (chinese[index] + (values[index] ? values[index] : '' )) }); console.log(str) } //欢迎订阅ES6专栏 您是第666位访问者
5.新增的字符串方法
5.1 查找字符串
在之前在字符串中查找字符串的时候,都是使用indexOf方法。
ES6新增了三个方法来查找字符串 :
includes 方法会在给定文本存在于字符串中的任意位置时返回 true,不然返回 false 。
startsWith 方法会在给定文本出如今字符串开头时返回 true,不然返回 false 。
endsWith 方法会在给定文本出如今字符串末尾时返回 true,不然返回 false 。
var msg = "Hello world!"; console.log(msg.startsWith("Hello")); // true console.log(msg.endsWith("!")); // true console.log(msg.includes("d")); // true console.log(msg.startsWith("d")); // false console.log(msg.endsWith("world!")); // true console.log(msg.includes("x")); // false
每一个方法都接收两个参数:须要搜索的文本和可选的起始索引值。
若第二个参数未提供,includes 和 startsWith 会从字符串的起始中开始检索,endsWith 则是从字符串的末尾。
实际上,第二个参数减小了须要检索的字符串的总量。
当提供第二个参数后,includes 和 startsWith 会以该索引为起始点进行匹配
console.log(msg.includes("d", 8)); // true console.log(msg.includes("d", 11)); // false console.log(msg.startsWith("d", 10)); // true console.log(msg.startsWith("d", 9)); // false
endsWith 将字符串的长度与参数值相减并将获得的值做为检索的起始点
console.log(msg.endsWith("d", 11)); // true ( 长度13 - 参数值11 = 起始点2 ) console.log(msg.endsWith("d", 8)); // false ( 长度13 - 参数值8 = 起始点5 )
应用场景:
(1)利用includes检查用户使用的浏览器
if (navigator.userAgent.includes('Chrome')) { console.log("是谷歌浏览器"); } else { console.log("不是谷歌浏览器"); }
(2)利用startsWith检查路径
let urlstr = "http://www.baidu.com"; let urlstr1 = "file:///C:/Users/xxx.html"; console.log(urlstr.startsWith("https://")); //false console.log(urlstr1.startsWith("file://")) //true
(3)利用startsWith检查文件格式
let path = "111.jpg"; console.log(path.endsWith(".png")); //false
5.2 字符串重复 -- repeat方法
接受一个数字参数做为字符串的重复次数。该方法返回一个重复包含初始字符串的新字符串,重复次数等于参数。
例如:
console.log("abc".repeat(4)); // "abcabcabcabc" let str = "小样儿"; console.log(str.repeat(10)); //小样儿小样儿小样儿小样儿小样儿小样儿小样儿小样儿小样儿小样儿
5.3 填充字符串
string.padStart 往字符串前面填充(在字符串前面插入字符串)
string.padEnd 往字符串后面填充(在字符串后面插入字符串)
let str = "Iphone"; let leftStr = "个人"; console.log(str.padStart(str.length + leftStr.length, leftStr));//个人Iphone let iphone = "Iphone"; let rightStr = "10"; console.log(iphone.padEnd(iphone.length + rightStr.length, rightStr)); //Iphone10
6.总结
ES6给字符串带来了不少实用性的扩展:
模板字符串、标签模板、repeat函数、includes函数、startsWith函数、endsWith函数、padStart函数、padEnd
函数。
字符串模版的出现让咱们不再用拼接变量了,并且支持在模板里有简单计算操做。
但愿你们能动手练习一下,并把这些新特性应用到工做中,很快就掌握了,用起来能让你们的工做更轻松,愉悦。