假设我想将变量插值添加到String中,如下所示:
String.prototype.interpolate = function() {
return this.replace(/{(\S+?)}/g, function(match, $1) {return eval($1);});
}
如果我的所有变量都是全局变量或本地变量,那么我可以将eval($1)
替换为this[$1]
。但是,如果我有var name = {first: 'Joe', last: 'Blogs'};
之类的内容,那么this[$1]
将无法插入"Hello, {name.first} {name.last}!".interpolate()
。有什么我可以用来代替eval()
吗?如果我期望这些变量来自不受信任的来源,那么我真的不能使用eval()
。
答案 0 :(得分:1)
如果您不想使用预先存在的模板引擎,我建议将数据显式插入:
String.prototype.interpolate = function(data) {
return this.replace(/{(\S+?)}/g, function(match, $1) {return data[$1];});
}
console.log( '{a} is better than {b}'.interpolate({'a':'explicit', 'b':'implicit'}) );