Javascript 如何将字符串转换为模板字符串
假设我有:Javascript 如何将字符串转换为模板字符串,javascript,typescript,ecmascript-6,Javascript,Typescript,Ecmascript 6,假设我有: var json = '{"greetings": "`${greetings}`"}'; var obj = JSON.parse(json); var template = obj.greetings; //`${greetings}` var greetings = 'hello'; 如何评估模板以获取hello?由于JSON.parse()将obj.greetings返回为字符串,因此可以使用eval()将字符串作为js运行
var json = '{"greetings": "`${greetings}`"}';
var obj = JSON.parse(json);
var template = obj.greetings; //`${greetings}`
var greetings = 'hello';
如何评估模板以获取hello?由于JSON.parse()
将obj.greetings
返回为字符串,因此可以使用eval()
将字符串作为js运行。所以只要:
var json = '{"greetings": "`${greetings}`"}';
var obj = JSON.parse(json);
var template = eval(obj.greetings); //`${greetings}`
var greetings = 'hello';
console.log(greetings)// hello
但使用eval()
时应始终小心,因为字符串可能是通过用户输入输入的
编辑:
上面带有eval
的代码返回undefined
。
这是因为JavaScript不适用于初始化变量
因此,我们当然需要移动初始化var问候语='hello'代码>在顶部。
不带eval()的解决方案
:
将模板字符串应用于整个字符串
var问候语='hello';
var json=`{“问候语”:“${问候语}”}`;
var obj=JSON.parse(JSON);
var模板=obj.greetings//`${问候}`
控制台日志(模板)//hello
由于JSON.parse()
将obj.greetings
返回为字符串,因此可以使用eval()
将字符串作为js运行。所以只要:
var json = '{"greetings": "`${greetings}`"}';
var obj = JSON.parse(json);
var template = eval(obj.greetings); //`${greetings}`
var greetings = 'hello';
console.log(greetings)// hello
但使用eval()
时应始终小心,因为字符串可能是通过用户输入输入的
编辑:
上面带有eval
的代码返回undefined
。
这是因为JavaScript不适用于初始化变量
因此,我们当然需要移动初始化var问候语='hello'代码>在顶部。
不带eval()的解决方案
:
将模板字符串应用于整个字符串
var问候语='hello';
var json=`{“问候语”:“${问候语}”}`;
var obj=JSON.parse(JSON);
var模板=obj.greetings//`${问候}`
控制台日志(模板)//您好
您基本上是在尝试将模板文字添加到JSON格式,这不是一种有效的语法。您可以尝试eval
:eval(模板)
@kaveh,但eval
不是一种非常糟糕的做法。@ThanveerShah这取决于情况。如果您信任json对象的源,那么就可以了。但是如果你不能控制它的内容,那么是的,它会破坏你的代码。不过,您可以使用正则表达式验证模板!基于这个问题,你基本上是在尝试将模板文字添加到JSON格式,这不是一种有效的语法。你可以尝试eval
:eval(template)
@kaveh,但eval
不是一种非常糟糕的做法。@ThanveerShah这取决于具体情况。如果您信任json对象的源,那么就可以了。但是如果你不能控制它的内容,那么是的,它会破坏你的代码。不过,您可以使用正则表达式验证模板!基于代码中的问题,模板
的值将不再是${greetings}
,以后不能在代码中使用<必须对“模板”调用代码>求值
。请参阅我对这个问题的评论。var greetings
将不会被值提升,请尝试在答案编辑器中将其放入堆栈片段(单击
)来运行它。整个字符串的反勾号是一个好主意,但如果json来自远程源代码,则值得注意的是不实用的。模板文本是在编译时解析的,因此在JSON.parse()运行之前,字符串中将包含“hello”<代码>模板
不会返回${hellies}
它已经有值了“hello”
@charlietfl是的,在这个简单的例子中它可以工作,但是在var json
初始化之后和json.parse()
之前再次更改问候语时,它仍然会返回旧值。即使传递对象引用以便以后更新,也不会起作用,因为它最终会在解析后释放引用。在代码中,template
的值不再是${greetings}
,并且以后不能在代码中使用<必须对“模板”调用代码>求值
。请参阅我对这个问题的评论。var greetings
将不会被值提升,请尝试在答案编辑器中将其放入堆栈片段(单击
)来运行它。整个字符串的反勾号是一个好主意,但如果json来自远程源代码,则值得注意的是不实用的。模板文本是在编译时解析的,因此在JSON.parse()运行之前,字符串中将包含“hello”<代码>模板不会返回${hellies}
它已经有值了“hello”
@charlietfl是的,在这个简单的例子中它可以工作,但是在var json
初始化之后和json.parse()
之前再次更改问候语时,它仍然会返回旧值。即使传递对象引用以便稍后更新,也不会起作用,因为它最终会在解析后释放引用。