ECMAScript6-模板字符串

模板字符串啊,模板字符串,整体给我的印象,有点像我之前用过的FreeMarker,一种占位符的感觉。

模板字符串使用反撇号`来取代普通字符串的单引号’或双引号”,除此之外,至少看起来与普通字符串没什么大区别。

模板字符串最基本的用途就是模板占位符(这就是为什么说是有点像FreeMarker)。

模板占位符表现为${JS表达式},这里的表达式可以是函数调用、算术运算、甚至还可以是模板占位符。JS表达式最后是字符串,因此,最后还是回归到toString()方法上。如果想在模板占位符输出关键字符,则在其前面添加反斜杠,例如:\`、\$、\{。

模板字符串可以多行书写,即2个`之间的字符串可以分成多行来书写,且中间的所有空格、换行、缩进都原样输出在生成的字符串中。

模板字符串有其自身的不足:

①不会自动转移特殊字符,因此为了避免跨站攻击XSS,需要开发者自己处理。

②与国际化库兼容不好。

③没有内建的循环语法与条件语句,因此无法通过循环方式来生成<tr/>之类的代码。

④综上所述,模板字符串仅仅是实现了一个简单的占位符功能,尚且无法与专业的模板引擎相提并论。

如果开发者就是不想用专业的模板引擎,想继续使用模板字符串来实现其他引擎类似的功能,其实也能实现,就是稍微麻烦点,这个麻烦点的技术就是:标签模板。

标签模板的语法就是:在模板字符串开始的反撇号`前面,附件一个额外的标记。这里的标记既可以是成员表达式,也可以是调用表达式。

var msg = test`<p>${book.writer},您好</p>`’

标签模板,你可以理解为完全简化了函数调用,因此,上面的代码等同于:

var msg = test(templateData,book.writer);

这里就详细说明下该函数:

参数templateData:是一个不可变数组,该数组存储着模板所有的字符串部分,由JS自动创建该数组,为什么说是不可变数组呢?那是因为占位符${}将标签模板进行了分割,因此数组长度、内容是固定的。另外该数组对象还有一个templateData.raw属性,该属性类型也是数组,也是存储标签模板中所有的字符串内容,只不过跟templateData中的内容不一样,举个例子:raw中会使用\n的转义字符还代表分行,而templateData则为真正的分行。

参数book.writer:这就是你要显示的内容。

剩下的,就看你根据自己的需求去完善test函数的内部逻辑了。这里可以解决掉模板字符串不支持循环遍历、逻辑判断等缺陷。

发布了167 篇原创文章 · 获赞 10 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章