摘要:由两部分组成模板起始符,称为沉音符反引号,其内容被识别为字符串模板。其实这是通过属性操作中的结果,也就是说属性将对控制符进行转义从而实现按照普通字符输出。的语法是紧跟在后面,两者间不能有空格或制表符等。
1. Brief
ES6(ECMAScript 6th edition)于2015年7月份发布,虽然各大浏览器仍未全面支持ES6,但我们可以在后端通过Node.js 0.12和io.js,而前端则通过Traceur或Babel这类Transpiler将ES6语法预转译为ES5语法,来提前兴奋一把。而仅需适配IE9+的朋友们现在更是可以开始撸ES6了,而不必为学哪门JavaScript超集语言而烦恼。(ES6又名为ECMAScript 2015或JavaScript.next,ES4的部分较为激进的特性被调用到该版本中实现。)
ES6带给我们很多惊喜,如class、module、export和import等。但在学习和运用到项目中时,我们需要注意以下两点:
ES6包含的是语法糖和语言、库的bug fix,对工程性问题没有太大的帮助;
由于Traceur和Babel无法对ES6的所有特性进行完整高效的polyfill,因此我们无法完全享用ES6的各项特性。
最近接手一个项目的前端改造,正在尝试全新的技术栈(Riot+ES6+Glup+Webpack),本系列文章将作为理论+项目实践的笔记供日后查阅。
2. What is Template Strings?一言以蔽之,Template Strings就是让我们减少字符串手工拼接的工作量。
2.1. Before ES6// Sample 1: 单行字符串拼接 var operand1 = 1 , operand2 = 2.1 var tpl1 = operand1 + " + " + operand2 + "~=" + parseInt(operand1+operand2) var tpl2 = [operand1, " + " , operand2, "~=", parseInt(operand1 + operand2)].join("") // Sample 2: 多行字符串拼接 var name = "fsjohnhuang" , id = "region" var tpl1 = "2.2. Embracing ES6" + "" + name + "" + "" var tpl2 = " "
// Sample 1: 单行字符串拼接 var operand1 = 1 , operand2 = 2.1 var tpl1 = `${operand1}+${operand2}~=${parseInt(operand1+operand2)}` // Sample 2: 多行字符串拼接 var name = "fsjohnhuang" , id = "region" var tpl1 = ``
假若了解过CoffeeScript,那么会发现ES6的Template Strings怎么这么眼熟。Template Strings由两部分组成:
1. 模板起始符—— ``,称为沉音符/反引号(grave accent),其内容被识别为字符串模板。
2. 表达式占位符—— ${
var x = 1 (function(){ var y = 2 (function(b){ var tpl = `${x},${y},${a},${b}` // 结果是 "1,2,undefined,5" }(5)) var a = 3 let c = 4 // 由于采用let来声明c变量,因此不会发生variable hoist }())2. ${
//real-time computing var tpl = `${x},${y}` var x = 1, y = 2 console.log(tpl) // "undefined, undefined" // lazy evaluation var tpl = ctx => `${ctx.x},${ctx.y}` console.log(tpl({x:1, y:2})) // "1, 2"3. 多行陷阱(pitfall of multiline),在编写HTML模板时我习惯如下写法
var tpl = "" // 然后是模板引擎解析tpl${title}
${subtitle}
那现在是否就可以毫无顾虑地改用Template Strings呢?
var tpl = ctx => `` // 直接调用tpl函数${ctx.title}
${ctx.subtitle}
答案是否定的
原因是通过正斜杠( )定义的多行字符串实际输出还是一行字符串而已,但通过反引号( `` )定义的是真实的多行字符串,且通过换行符( )分隔每一行。
// 通过定义多行的结果// 通过反引号定义多行的结果${ctx.title}
${ctx.subtitle}${ctx.title}
${ctx.subtitle}
那么当使用jQuery将反引号定义的HTML模板来生产DOM元素时就会直接报错了,这时我们需要删除这些控制字符。
var removeCtlChar = raw => raw.replace(/[ vf]/ig, "")3. What is Tagged Template Strings?
从上文我们了解到Template Strings是以整体为单位进行即时计算,也就是说留给我们的自主操控能力是十分有限的。而Tagged Template Strings则大大增强了我们的操控欲望。
其实Tagged Template Strings实质上是对Template Strings进行Tokenize操作,从而细化我们的可操作粒度。而词法类型分为 字符串 和 表达式占位符的运算结果。
var x = 1, y = 2 var tpl = "hello${x}:${y+1}" // Tokenize后的结果 var tokens = ["hello", 1, ":", 3, ""]
具体玩法如下:
// 语法/** Sample **/ /* 定义 * @param {Array. } strings - 字符串类型的tokens * @param {...Any} vals - 表达式占位符的运算结果tokens * @returns {Any} */ var taggedFunc = (strings, ...vals){ var ret = [] for(let i = 0, len = strings.length ; i < len; ++i) ret.push(strings.raw[i], vals[i] || "") return ret } // 定义Template Strings var x = 1, y =2 var ret = taggedFunc` Hello${x}:${y+1}` console.log(ret) // 显示 " Hello1:3" console.log(` Hello${x}:${y+1}`) // 显示 " Hello1:3"
函数 有两个入参分别代表两类token。 {Array.} strings 为字符串类型的tokens,而 {...Any} vals 则为表达式占位符运算结果tokens。
而需要注意的是: strings.length === vals.length + 1
另外我们看到最后两行代码会发现 ` Hello${x}:${y+1}` 中的制表符将在输出结果中起效,而经过Tagged Function处理的则按普通字符输出而已。其实这是通过 {Array.
其作用与上述的taggedFunc一样,就是将按普通字符输出Template Strings中的控制符。
3.2. CautionsTagge Template Strings的语法是Template Strings紧跟在Tagged Function后面,两者间不能有空格或制表符等。
vals是运算后的实际值,若要延迟计算依然需要加壳。
@ruanyifeng老师说可通过Tagged Function来自定义带流程控制的模板语言
// 下面的hashTemplate函数 // 是一个自定义的模板处理函数 var libraryHtml = hashTemplate`
本人觉得这种用法不可取,Tagged Function本来就按照自身规则对模板进行Tokenize,然后我们在此基础上对结果进行二次Tokenize,那还不如直接按自己定义的规则来做词法分析更省心。
4. ConclusionTemplate Strings和Tagged Template Strings 均可通过Traceur和Babel做transpile,所以我们现在就可以撸起了,开干吧各位!
5. Thankshttp://es6.ruanyifeng.com/#docs/string
http://www.sitepoint.com/understanding-ecmascript-6-template-strings/
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/85768.html
摘要:学习笔记字符串模板实例模板编译先组成一个模板使用放置代码使用输出表达式。这被称为标签模板功能。该数组的成员与数组完全一致参考引用字符串扩展 es6学习笔记-字符串模板_v1.0 实例:模板编译 //先组成一个模板 var template = ` //使用放置JavaScript代码 //使用输出JavaScript表达式。 `; //这是编译模板的函数,将模...
摘要:以前现在创建一个叫做的变量,值是数组中第一个对象中键的值。以前用的时候使用链式来处理这种连续请求。一个可以一个,并且等待结果以后再进行下一步。并且一请求到就立即打印结果,并不等待后续的请求完成。 String Template Strings 连接String更方便直观。使用反引号包括要生成的String,使用${}包括具体变量。 var name = Yixuan; var emai...
摘要:如果使用模板字符串表示多行字符串,则所有的空格缩进和换行都会被保留在输出中。模板字符串中嵌入变量,要将变量名写在之中。变量没有声明模板字符串之间还可以进行嵌套。上面代码中,模板字符串前面有一个标识名,它是一个函数。 语法 模板字符串(Template String)是增强版的字符串,用反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。 用法 ...
摘要:前三个是为了解决变量声明定义的问题,而最后一个则影响最大。下文只介绍前三个特性。这是因为的的不支持块级作用域,变量仅仅被限制到函数作用域内。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_syntax_features.html 源代码: https://github.com/RobinQu/P...
摘要:前三个是为了解决变量声明定义的问题,而最后一个则影响最大。下文只介绍前三个特性。这是因为的的不支持块级作用域,变量仅仅被限制到函数作用域内。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_syntax_features.html 源代码: https://github.com/RobinQu/P...
阅读 1858·2021-09-22 15:29
阅读 3350·2019-08-30 15:44
阅读 3557·2019-08-30 15:43
阅读 1763·2019-08-30 13:48
阅读 1488·2019-08-29 13:56
阅读 2473·2019-08-29 12:12
阅读 964·2019-08-26 11:35
阅读 1050·2019-08-26 10:25