Пытаясь избежать JavaScript eval () - PullRequest
3 голосов
/ 17 марта 2012

Допустим, я хочу добавить переменную интерполяцию в строку следующим образом:

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().

1 Ответ

1 голос
/ 17 марта 2012

Если вы не хотите использовать уже существующий шаблонизатор, я бы предложил сделать явную интерполяцию данных:

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'}) );
...