摘要:由兩部分組成模板起始符,稱為沉音符反引號(hào),其內(nèi)容被識(shí)別為字符串模板。其實(shí)這是通過(guò)屬性操作中的結(jié)果,也就是說(shuō)屬性將對(duì)控制符進(jìn)行轉(zhuǎn)義從而實(shí)現(xiàn)按照普通字符輸出。的語(yǔ)法是緊跟在后面,兩者間不能有空格或制表符等。
1. Brief
ES6(ECMAScript 6th edition)于2015年7月份發(fā)布,雖然各大瀏覽器仍未全面支持ES6,但我們可以在后端通過(guò)Node.js 0.12和io.js,而前端則通過(guò)Traceur或Babel這類Transpiler將ES6語(yǔ)法預(yù)轉(zhuǎn)譯為ES5語(yǔ)法,來(lái)提前興奮一把。而僅需適配IE9+的朋友們現(xiàn)在更是可以開始擼ES6了,而不必為學(xué)哪門JavaScript超集語(yǔ)言而煩惱。(ES6又名為ECMAScript 2015或JavaScript.next,ES4的部分較為激進(jìn)的特性被調(diào)用到該版本中實(shí)現(xiàn)。)
ES6帶給我們很多驚喜,如class、module、export和import等。但在學(xué)習(xí)和運(yùn)用到項(xiàng)目中時(shí),我們需要注意以下兩點(diǎn):
ES6包含的是語(yǔ)法糖和語(yǔ)言、庫(kù)的bug fix,對(duì)工程性問(wèn)題沒(méi)有太大的幫助;
由于Traceur和Babel無(wú)法對(duì)ES6的所有特性進(jìn)行完整高效的polyfill,因此我們無(wú)法完全享用ES6的各項(xiàng)特性。
最近接手一個(gè)項(xiàng)目的前端改造,正在嘗試全新的技術(shù)棧(Riot+ES6+Glup+Webpack),本系列文章將作為理論+項(xiàng)目實(shí)踐的筆記供日后查閱。
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 = ``
假若了解過(guò)CoffeeScript,那么會(huì)發(fā)現(xiàn)ES6的Template Strings怎么這么眼熟。Template Strings由兩部分組成:
1. 模板起始符—— ``,稱為沉音符/反引號(hào)(grave accent),其內(nèi)容被識(shí)別為字符串模板。
2. 表達(dá)式占位符—— ${
var x = 1 (function(){ var y = 2 (function(b){ var tpl = `${x},${y},${a},$` // 結(jié)果是 "1,2,undefined,5" }(5)) var a = 3 let c = 4 // 由于采用let來(lái)聲明c變量,因此不會(huì)發(fā)生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模板時(shí)我習(xí)慣如下寫法
var tpl = "" // 然后是模板引擎解析tpl${title}
${subtitle}
那現(xiàn)在是否就可以毫無(wú)顧慮地改用Template Strings呢?
var tpl = ctx => `` // 直接調(diào)用tpl函數(shù)${ctx.title}
${ctx.subtitle}
答案是否定的
原因是通過(guò)正斜杠( )定義的多行字符串實(shí)際輸出還是一行字符串而已,但通過(guò)反引號(hào)( `` )定義的是真實(shí)的多行字符串,且通過(guò)換行符( )分隔每一行。
// 通過(guò)定義多行的結(jié)果// 通過(guò)反引號(hào)定義多行的結(jié)果${ctx.title}
${ctx.subtitle}${ctx.title}
${ctx.subtitle}
那么當(dāng)使用jQuery將反引號(hào)定義的HTML模板來(lái)生產(chǎn)DOM元素時(shí)就會(huì)直接報(bào)錯(cuò)了,這時(shí)我們需要?jiǎng)h除這些控制字符。
var removeCtlChar = raw => raw.replace(/[ vf]/ig, "")3. What is Tagged Template Strings?
從上文我們了解到Template Strings是以整體為單位進(jìn)行即時(shí)計(jì)算,也就是說(shuō)留給我們的自主操控能力是十分有限的。而Tagged Template Strings則大大增強(qiáng)了我們的操控欲望。
其實(shí)Tagged Template Strings實(shí)質(zhì)上是對(duì)Template Strings進(jìn)行Tokenize操作,從而細(xì)化我們的可操作粒度。而詞法類型分為 字符串 和 表達(dá)式占位符的運(yùn)算結(jié)果。
var x = 1, y = 2 var tpl = "hello${x}:${y+1}" // Tokenize后的結(jié)果 var tokens = ["hello", 1, ":", 3, ""]
具體玩法如下:
// 語(yǔ)法/** Sample **/ /* 定義 * @param {Array. } strings - 字符串類型的tokens * @param {...Any} vals - 表達(dá)式占位符的運(yùn)算結(jié)果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"
函數(shù) 有兩個(gè)入?yún)⒎謩e代表兩類token。 {Array.} strings 為字符串類型的tokens,而 {...Any} vals 則為表達(dá)式占位符運(yùn)算結(jié)果tokens。
而需要注意的是: strings.length === vals.length + 1
另外我們看到最后兩行代碼會(huì)發(fā)現(xiàn) ` Hello${x}:${y+1}` 中的制表符將在輸出結(jié)果中起效,而經(jīng)過(guò)Tagged Function處理的則按普通字符輸出而已。其實(shí)這是通過(guò) {Array.
其作用與上述的taggedFunc一樣,就是將按普通字符輸出Template Strings中的控制符。
3.2. CautionsTagge Template Strings的語(yǔ)法是Template Strings緊跟在Tagged Function后面,兩者間不能有空格或制表符等。
vals是運(yùn)算后的實(shí)際值,若要延遲計(jì)算依然需要加殼。
@ruanyifeng老師說(shuō)可通過(guò)Tagged Function來(lái)自定義帶流程控制的模板語(yǔ)言
// 下面的hashTemplate函數(shù) // 是一個(gè)自定義的模板處理函數(shù) var libraryHtml = hashTemplate`
本人覺(jué)得這種用法不可取,Tagged Function本來(lái)就按照自身規(guī)則對(duì)模板進(jìn)行Tokenize,然后我們?cè)诖嘶A(chǔ)上對(duì)結(jié)果進(jìn)行二次Tokenize,那還不如直接按自己定義的規(guī)則來(lái)做詞法分析更省心。
4. ConclusionTemplate Strings和Tagged Template Strings 均可通過(guò)Traceur和Babel做transpile,所以我們現(xiàn)在就可以擼起了,開干吧各位!
5. Thankshttp://es6.ruanyifeng.com/#docs/string
http://www.sitepoint.com/understanding-ecmascript-6-template-strings/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/85768.html
摘要:學(xué)習(xí)筆記字符串模板實(shí)例模板編譯先組成一個(gè)模板使用放置代碼使用輸出表達(dá)式。這被稱為標(biāo)簽?zāi)0骞δ?。該?shù)組的成員與數(shù)組完全一致參考引用字符串?dāng)U展 es6學(xué)習(xí)筆記-字符串模板_v1.0 實(shí)例:模板編譯 //先組成一個(gè)模板 var template = ` //使用放置JavaScript代碼 //使用輸出JavaScript表達(dá)式。 `; //這是編譯模板的函數(shù),將模...
摘要:以前現(xiàn)在創(chuàng)建一個(gè)叫做的變量,值是數(shù)組中第一個(gè)對(duì)象中鍵的值。以前用的時(shí)候使用鏈?zhǔn)絹?lái)處理這種連續(xù)請(qǐng)求。一個(gè)可以一個(gè),并且等待結(jié)果以后再進(jìn)行下一步。并且一請(qǐng)求到就立即打印結(jié)果,并不等待后續(xù)的請(qǐng)求完成。 String Template Strings 連接String更方便直觀。使用反引號(hào)包括要生成的String,使用${}包括具體變量。 var name = Yixuan; var emai...
摘要:如果使用模板字符串表示多行字符串,則所有的空格縮進(jìn)和換行都會(huì)被保留在輸出中。模板字符串中嵌入變量,要將變量名寫在之中。變量沒(méi)有聲明模板字符串之間還可以進(jìn)行嵌套。上面代碼中,模板字符串前面有一個(gè)標(biāo)識(shí)名,它是一個(gè)函數(shù)。 語(yǔ)法 模板字符串(Template String)是增強(qiáng)版的字符串,用反引號(hào)(`)標(biāo)識(shí),它可以當(dāng)作普通字符串使用,也可以用來(lái)定義多行字符串,或者在字符串中嵌入變量。 用法 ...
摘要:前三個(gè)是為了解決變量聲明定義的問(wèn)題,而最后一個(gè)則影響最大。下文只介紹前三個(gè)特性。這是因?yàn)榈牡牟恢С謮K級(jí)作用域,變量?jī)H僅被限制到函數(shù)作用域內(nèi)。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_syntax_features.html 源代碼: https://github.com/RobinQu/P...
摘要:前三個(gè)是為了解決變量聲明定義的問(wèn)題,而最后一個(gè)則影響最大。下文只介紹前三個(gè)特性。這是因?yàn)榈牡牟恢С謮K級(jí)作用域,變量?jī)H僅被限制到函數(shù)作用域內(nèi)。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_syntax_features.html 源代碼: https://github.com/RobinQu/P...
閱讀 2074·2021-09-22 15:29
閱讀 3417·2019-08-30 15:44
閱讀 3628·2019-08-30 15:43
閱讀 1824·2019-08-30 13:48
閱讀 1564·2019-08-29 13:56
閱讀 2558·2019-08-29 12:12
閱讀 1033·2019-08-26 11:35
閱讀 1117·2019-08-26 10:25