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

面試官:你能實現一個 JavaScript 模板引擎嗎?

開發 前端
with? 關鍵字屬于被棄用的語法(但是 Vue3 的源碼中依然使用到了 with),但是在這里依然可以實現對應的功能。

Hello,大家好,我是 Sunday。

這個問題具體是這樣的:請為字符串增加一個 render 方法,可以實現如下最終的打印。

const template = '我是 ${name}, 年齡 ${age} 歲'
const employee = {
  name: 'Sunday',
  age: 18
}
const renderStr = template.render(employee)
// 輸出成字符串
console.log(renderStr) 
// '我是 Sunday, 年齡 18 歲'

乍一看,這不就是 模板引擎 嗎?合著這是讓我手寫一個 `` 的簡易版出來啊。

不過還好,既然是簡易版那就并不復雜。一共有三種方式,咱們來看看吧!

01:利用正則表達式

使用正則表達式應該是大多數的同學第一時間想到的方案了。

只需要通過正則替換 ${name} 和 ${age} 就可以直接實現對應的功能。

String.prototype.render = function (obj) {
  const template = this
  const variableRegex = /\$\{([^${}]+)\}/g
  template.replace(variableRegex, ($0, variable) => {
     // 打印對應的屬性
    console.log(variable)
  })
}
const template = '我是 ${name}, 年齡 ${age} 歲'
template.render()

通過以上代碼我們可以直接拿到 ${name} 之中的屬性,所以接下來咱們就只需要完成替換即可。

// 為 String 對象的原型添加一個名為 render 的方法
String.prototype.render = function (obj) {
  // 保存調用該方法的字符串實例
  const template = this;
  // 定義一個正則表達式,用于匹配 ${variableName} 格式的變量
  const variableRegex = /\$\{([^${}]+)\}/g;
  // 定義一個函數,用于根據傳入的對象獲取變量的值
  const getVariableValue = (variable) => {
    // 將變量名按照 '.' 分隔成數組,例如 'user.name' 會分隔成 ['user', 'name']
    variable = variable.split('.');
    // 初始化 variableValue,使其指向傳入的對象 obj
    let variableValue = obj;
    // 遍歷分隔后的變量名數組,逐層獲取嵌套屬性的值
    while (variable.length) {
      // 取出數組的第一個元素,并獲取對應的屬性值
      variableValue = variableValue[variable.shift()];
    }
    // 返回最終獲取到的變量值
    return variableValue;
  };
  // 使用 replace 方法替換模板字符串中的變量
  // $0 是匹配到的整個字符串,例如 ${name}
  // variable 是捕獲組中的變量名,例如 name
  const renderStr = template.replace(variableRegex, ($0, variable) => {
    // 獲取變量值并替換模板中的變量
    return getVariableValue(variable);
  });
  // 返回替換后的字符串
  return renderStr;
};

02:使用 eval

eval() 函數會將傳入的字符串當做 JavaScript 代碼進行執行。

比如:

const employee = {
  name: 'Sunday',
  age: 18
}
const { name } = employee
console.log(name) // Sunday

這樣的代碼使用 eval 方法可以這么寫:

const employee = {
  name: 'Sunday',
  age: 18
}
// 注意:必須是 var
eval('var { name } = employee')

console.log(name) // Sunday

這樣的好處在于 可以根據 obj 的 key 動態的生成新的變量。

因此,就可以得到如下代碼:

// 為 String 對象的原型添加一個名為 render 的方法
String.prototype.render = function (obj) {
  // 保存調用該方法的字符串實例
  const template = this;

  // 使用 eval 動態解構 obj 對象,將其屬性名作為變量名,并賦值給這些變量
  // 例如,obj = { name: 'Sunday', age: 18}
  // 生成的代碼類似于:var { name, age, job } = obj;
  eval(`var {${Object.keys(obj).join(',')}} = obj`);

  // 使用模板字符串替換變量,并生成最終的字符串
  // 這里的 eval 用于解析和執行模板字符串,其中包含 obj 對象的屬性值
  // 例如,template = '我是 ${name}, 年齡 ${age} 歲'
  // 生成的代碼類似于:`我是 ${name}, 年齡 ${age} 歲`
  const renderStr = eval('`' + template + '`');

  // 返回替換后的字符串
  return renderStr;
}

03:with 關鍵字

with 語句擴展一個語句的作用域鏈

with 關鍵字屬于被棄用的語法(但是 Vue3 的源碼中依然使用到了 with),但是在這里依然可以實現對應的功能。

圖片圖片

我們可以通過以下示例來演示 with 的作用:

const employee = {
  name: 'Sunday',
  age: 18
}
with (employee) {
  console.log(name, age)  // Sunday 18
}

基于這個特性,使用 with 實現這個功能就非常簡單了。

String.prototype.render = function (obj) {
  with(obj) {
     // this 實例。即:我是 ${name}, 年齡 ${age} 歲
     // 兩邊加上 ` ` 即可利用 ES6 的模板運算符實現此功能
    return eval('`' + this + '`')
  }
}
責任編輯:武曉燕 來源: 程序員Sunday
相關推薦

2023-08-11 17:13:39

JavaScrip

2023-07-31 08:26:09

2022-04-08 08:26:03

JavaHTTP請求

2021-09-28 13:42:55

Chrome Devwebsocket網絡協議

2017-03-15 08:43:29

JavaScript模板引擎

2017-03-20 17:59:19

JavaScript模板引擎

2021-07-05 07:55:11

String[]byte轉換

2015-08-13 10:29:12

面試面試官

2021-12-13 11:54:13

SetEs6接口

2019-06-21 15:20:05

Redis數據結構數據庫

2023-01-18 17:50:35

系統架構Kafka

2022-10-08 00:08:00

apiESFacebook

2021-06-09 07:55:19

NodeEventEmitte驅動

2022-07-15 08:22:42

對象符串鍵Symbol

2020-08-10 07:49:51

服務器

2024-08-27 12:36:33

2021-02-25 07:08:30

JavaScript 前端面試題

2022-02-07 20:18:29

Redis緩存裝飾

2025-04-29 02:00:00

高并發系統場景

2024-01-22 10:07:48

Redis持久化功能緩存擊穿
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线亚洲欧美 | 超碰在线人人干 | 日韩欧美中文字幕在线观看 | 99精品视频在线观看 | 国产精品久久久久久高潮 | 最新免费黄色网址 | 国产毛片毛片 | 中国免费黄色片 | 手机在线不卡av | 久久久婷婷 | 欧美中文字幕一区二区三区亚洲 | 亚洲国产激情 | 精品久久久久久久久久久久 | www.久久| 久青草影院 | 欧美影院| 一区二区在线 | 国产视频线观看永久免费 | 国产精品日韩欧美一区二区三区 | 国产色婷婷久久99精品91 | 九九久久精品 | 一区二区三区国产好 | 伊人一区 | 在线一区| 国产精品乱码一区二三区小蝌蚪 | 日韩精品在线播放 | 国产在线观看 | 国产一级视频 | 日日操视频 | 超碰天天 | 国产免费视频 | 91精品国产乱码久久久久久久久 | 青青草精品 | 国产精品久久久久免费 | 国产乱码精品一区二区三区忘忧草 | 欧美久久一区 | 日韩中文字幕高清 | 黄色欧美视频 | 欧美一级高潮片免费的 | 国产精品美女 | av在线一区二区三区 |