惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
Recent Announcements
Recent Announcements
H
Help Net Security
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
小众软件
小众软件
Last Week in AI
Last Week in AI
U
Unit 42
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
云风的 BLOG
云风的 BLOG
V
V2EX
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿

Surmon.me

一人有限集团 你就是不敢 创造力是温柔的谎言 人类正在退出人类 AI 代替不了这样的你 脉冲点火背后的架构设计 基于 Cloudflare 生态的 AI Agent 实现 NodePress 支持用户登录了 从统计学习到通用智能 2025 投资报告:走慢的路 无依之地 会杀人的菩萨 无我不是共识 文化的积重与偏见 当下即安 科学的尽头是态度 无我不是 Egoless 信仰不因恐惧而存在 世间无解的矛与盾 先别急着做些什么 佛不需要你的皈依 真理的幻觉 两扇大门 造心里的浮屠 自胜者强 逻辑与智慧 真的相 快乐的秘密 只需愿意 是名体验
一道有趣的 JavaScript 面试题
Surmon · 2017-04-10 · via Surmon.me

原创

阿里的一道测试题(群里的小伙伴提供的),题目大概这样:

大概就是让写个简单的模板解析器,尝试了好多种解构的方法都没成功...

先思考,下面就是答案了!

问题代码:

        
        

1234567891011

var greeting = 'My name is ${name}, age ${age}, I am a ${job.jobName}'; var employee = { name: 'XiaoMing', age: 11, job: { jobName: 'designer', jobLevel: 'senior' } }; var result = greeting.render(employee); console.log(result);

解决方案一(绝大多数的解决方案-正则)

        
        

12345678

// 你可以趁机想想还有没有其他解法,时间充裕 // 代码参考自 @剪影boy + @Zhongsheng String.prototype.render = function(obj) { return this.replace(/\$\{(\w+|\w+\.\w+)\}/g, match => { var keys = match.replace('${', '').replace('}', '').split('.') return keys.reduce((acc, cv) => acc[cv], obj) }) }

解决方案二(字符串模板)

        
        

1234567

// 这办法是我自己想到的,有点笨 String.prototype.render = function(obj) { // 利用了ES6的解构、对象keys新方法,在函数内部解构并自动展开变量 eval(`var {${Object.keys(obj).join(',')}} = obj`) // 利用eval使字符串直接作为ES6解析 return eval('`' + this + '`') }

方案二是后来不断尝试得到的

拿键声明变量 => 拒绝循环所以用 keys => 数组转成字符串再组合对象字符 => eval 去构造解构 => OK!

对 JS 又爱出了新高度 😂 six six six!

解决方案三(With 函数)

        
        

123456

// 代码由 掘金@一口怪兽一口烟 提供 String.prototype.render = function (obj) { with(obj) { return eval('`' + this + '`') } }

莫非是史上最优解?😂 double click six six six!

期待更多的解法

字符串模板支持函数变量表达式,纯天然的模板解析器,如果是 Mustache 范儿,解析前 replace 下就行了

不再补充明细


去控制台跑下试试吧

随时欢迎补充!

相关学习资料: