成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

三種實現(xiàn) JavaScript 模板引擎的方法

開發(fā) 前端
小伙伴們,相信即使你是經(jīng)驗豐富的開發(fā)者,也未必能很快的解決這道面試題。如果您想質(zhì)疑這一說法,請繼續(xù)閱讀下去。

小伙伴們,相信即使你是經(jīng)驗豐富的開發(fā)者,也未必能很快的解決這道面試題。如果您想質(zhì)疑這一說法,請繼續(xù)閱讀下去。

最近,我的好朋友南希遇到了一個讓她發(fā)瘋的問題,面試官要求她現(xiàn)場實現(xiàn)一個JavaScript模板引擎。

很傷心,因為我的朋友只是在找工作,但面試官讓她造一架飛機。

問題如下:

請向 String 對象添加一個 render(obj) 方法,它的作用是將字符串中的特定字符替換為obj的相應(yīng)屬性。

const template = 'My name is ${name}, age ${age}, I am a ${job.name}'
const employee = {
name: 'fatfish',
age: 100,
job: {
name: 'front end development'
}
}
const renderStr = template.render(employee)
// What is the output string?
console.log(renderStr) // 'My name is fatfish, age 100, I am a front end development'

什么是模板引擎?

你一定用過nunjucks之類的模板引擎,題型和它的功能很像,請跟著我一起舉個例子。

nunjucks.configure({ autoescape: true })
const template = 'My name is `name`, age `age`, I am a `job`.`name`'
const employee = {
name: 'fatfish',
age: 100,
job: {
name: 'front end development'
}
}
const renderStr = nunjucks.renderString(template, employee)
console.log(renderStr) // My name is fatfish, age 100, I am a front end development

我可憐的朋友被要求實現(xiàn)這樣的東西,它只是將 ${name} 替換為 `name` 而幾乎沒有別的。

解決方案 1:正則表達式

看到這個面試題,我的第一反應(yīng)是用正則表達式來解決。只要我們能提取出字符串中的具體字符(name、age、job.name),問題就迎刃而解了。

第 1 步:提取變量

String.prototype.render = function (obj) {
const template = this
const variableRegex = /\$\{([^${}]+)\}/g
template.replace(variableRegex, ($0, variable) => {
console.log(variable)
})
}
const template = 'My name is ${name}, age ${age}, I am a ${job.name}'
template.render()

圖片

太好了,我們得到了 name、age、job.name 變量。下面我們來看看這個正則表達式是什么意思,可以點這個鏈接:https://jex.im/regulex/#!flags=&re=%5C%24%5C%7B(%5B%5E%24%7B%7D%5D%2B)%5C%7D進行查看。

const variableRegex = /\$\{([^${}]+)\}/g

我們要關(guān)注 ([^${}]+),這意味著至少有一個除 $、{、} 之外的字符。

第二步:獲取obj的具體值

當我們得到name, age, job.name,如何關(guān)聯(lián)到employee?


String.prototype.render = function (obj) {
const template = this
const variableRegex = /\$\{([^${}]+)\}/g
const getVariableValue = (variable) => {
// [ 'name' ]、[ 'age' ]、[ 'job', 'name' ]
variable = variable.split('.')
let variableValue = obj
// For example, if we want to get the value of job.name, we will go through the following steps
// Initialization: variableValue = { name: 'fatfish', age: 100, job: { name: "front end development" } }
// first loop: variableValue = { name: "front end development" }
// Second loop: variableValue = 'front end development'
// Third loop: finished, return 'front end development'
while (variable.length) {
variableValue = variableValue[ variable.shift() ]
}
return variableValue
}
const renderStr = template.replace(variableRegex, ($0, variable) => {
return getVariableValue(variable)
})
return renderStr
}

const template = 'My name is ${name}, age ${age}, I am a ${job.name}'
const employee = {
name: 'fatfish',
age: 100,
job: {
name: 'front end development'
}
}
const renderStr = template.render(employee)

console.log(renderStr)

我們通過正則表達式實現(xiàn)了一個簡單的模板引擎,請小伙伴們?yōu)樽约捍驓狻?/p>

解決方案 2:eval

朋友們,讓我們回顧一下es6中模板字符串的基本用法。

const name = 'fatfish'
const age = 100
const job = {
name: 'front end development'
}
const renderString = `My name is ${name}, age ${age}, I am a ${job.name}`

console.log(renderString)

模板字符串非常有用,它們允許我們在字符串中嵌入表達式。

圖片

讓我們再次學(xué)習(xí)如何使用 eval。

const employee = {
name: 'fatfish',
age: 100,
job: {
name: 'front end development'
}
}
eval('var { name, age, job } = employee')

console.log(name, age, job)

很神奇,就好像我們聲明了三個變量name、age、job,我們可以隨意打印出它們的值。

有了這兩個知識點,我們的第二個方案就出來了。

String.prototype.render = function (obj) {
const template = this
// var { name, age, job } = obj
eval(`var {${Object.keys(obj).join(',')}} = obj`)
// `My name is ${name}, age ${age}, I am a ${job.name}`
const renderStr = eval('`' + template + '`')
return renderStr
}
const template = 'My name is ${name}, age ${age}, I am a ${job.name}'
const employee = {
name: 'fatfish',
age: 100,
job: {
name: 'front end development'
}
}

const renderStr = template.render(employee)

圖片

給自己鼓掌,因為你已經(jīng)用兩種方式實現(xiàn)了一個精簡版模板引擎。

解決方案3:with

雖然我們很少用到with關(guān)鍵字,但是可以用來解決這個問題。

這段代碼的輸出是什么?

const employee = {
name: 'fatfish',
age: 100,
job: {
name: 'front end development'
}
}
with (employee) {
console.log(name, age, job)
}

圖片

這與上面的代碼幾乎具有相同的效果,但更加簡潔易懂。

// var { name, age, job } = obj
eval(`var {${Object.keys(obj).join(',')}} = obj`)

好吧,我想你已經(jīng)猜到了答案。

String.prototype.render = function (obj) {
with(obj) {
return eval('`' + this + '`')
}
}
const template = 'My name is ${name}, age ${age}, I am a ${job.name}'
const employee = {
name: 'fatfish',
age: 100,
job: {
name: 'front end development'
}
}
const renderStr = template.render(employee)

console.log(renderStr)

最后總結(jié)

以上就是我今天跟你分享的3種JavaScript模板引擎的實現(xiàn)方法,希望對你有幫助,如果你覺得有用的話,請點贊我,關(guān)注我,并將它分享給你周圍的朋友。

責(zé)任編輯:華軒 來源: web前端開發(fā)
相關(guān)推薦

2020-09-08 12:53:47

C++數(shù)據(jù)線程

2022-01-04 16:50:47

JavaScript圖片網(wǎng)站

2010-09-30 15:37:29

ScrollBarJavascrip

2017-12-29 08:26:28

存儲引擎MySQL

2021-07-13 12:31:27

IT組織改進首席技術(shù)官

2013-01-04 15:47:54

Android開發(fā)平鋪UI設(shè)計

2015-05-07 15:19:47

IaaSPaaSAzure

2009-07-08 12:56:32

編寫Servlet

2019-08-30 17:24:41

microservic微服務(wù)

2021-11-05 21:33:28

Redis數(shù)據(jù)高并發(fā)

2014-12-31 17:42:47

LBSAndroid地圖

2021-06-24 08:52:19

單點登錄代碼前端

2024-11-06 09:28:52

架構(gòu)客戶端靜態(tài)

2010-08-26 16:19:41

DIV圓角

2015-12-11 09:24:38

加密數(shù)據(jù)Linux

2016-09-12 14:07:14

Android 定時器

2022-05-30 07:07:35

Java監(jiān)聽文件Java 8

2022-07-13 16:06:16

Python參數(shù)代碼

2009-12-11 18:49:39

預(yù)算編制博科資訊

2024-11-15 07:00:00

Python發(fā)送郵件
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 色婷婷国产精品综合在线观看 | 日日操操| 黄色一级免费看 | 精品久久久久久久人人人人传媒 | 日韩在线高清 | 成人在线视频看看 | 福利av在线 | 国产精品影视在线观看 | 日韩精品一区二区三区中文在线 | 波多野吉衣在线播放 | 日韩精品无码一区二区三区 | 久久久久国产 | 在线视频一区二区 | 91精品国产一区二区三区 | 久久精品二区 | 亚洲精品免费观看 | 凹凸日日摸日日碰夜夜 | 色综合色综合色综合 | av网站免费看 | 欧美一区二区三区在线 | 久久精品国产一区二区电影 | 午夜精品一区二区三区免费视频 | 一区二区三区国产精品 | 国产香蕉视频在线播放 | 精品国产三级 | 999国产视频 | 黑人巨大精品欧美一区二区免费 | 亚洲九色 | 欧美成年网站 | 国产精品美女久久久久久免费 | 新91视频网 | 免费看91| 国产成人福利视频 | 中文字幕在线观看一区 | 日韩视频精品在线 | 亚洲区视频| 精品久久久一区 | 手机在线一区二区三区 | 精品国产免费一区二区三区演员表 | 成人精品一区二区户外勾搭野战 | 日韩欧美在线视频观看 |