题目
友情提示:
eval() 不推荐在开发中使用,会降低代码执行效率
建议友友们仅将以下方法作为面试题了解
为String添加一个render方法,将${xxx}
字符串替换成obj对应属性
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);
注意!!!
以下两种方法 在 严格模式 下均无法正常执行
方案一
String.prototype.render = function (obj) {
// 先把obj中的值解构出来
eval(`var {${Object.keys(obj).join(',')}} = obj`)
// 这里的this是greeting字符串
// 需要先把字符串用模板字符串包裹起来,这样才能够让this读取上边解构的对象属性
return eval('`' + this + '`')
}
方案二
String.prototype.render = function (obj) {
// 使用with函数相当于方案一中的结构
with (obj) {
return eval('`' + this + '`')
}
}
eval() 函数
计算 JavaScript 字符串,并把它作为脚本代码来执行。
如果参数是一个表达式,eval() 函数将执行表达式。
如果参数是Javascript语句,eval()将执行 Javascript 语句。
with() 函数
避免冗余的对象调用
在严格模式下('use strict'
),使用with会直接报错
foo.bar.baz.x = 1;
foo.bar.baz.y = 2;
foo.bar.baz.z = 3;
with(foo.bar.baz){
x = 1;
y = 2;
z = 3;
}
以上内容来自公众号中看到的文章
整理了一下作为记录
公众号贴在这里(感谢大佬提供的学习机会)
欢迎大佬们提出更多更好的方案!!!