Do eval()首先对求值后的字符串进行字面翻译
Does eval() first makes a literal translation of the evaluated string?
尝试在浏览器中执行以下代码:
eval("(function() { console.log(JSON.parse('" + JSON.stringify('THIS IS COOL') + "')); })()");
它应该打印出CCD_ 1,但是,如果您执行以下操作:
eval("(function() { console.log(JSON.parse('" + JSON.stringify('THIS IS "NOT" COOL') + "')); })()");
它将失败,而不是打印THIS IS "NOT" COOL
有人能解释为什么会发生这种情况吗?
请注意:
JSON.stringify('THIS IS "NOT" COOL')
的结果是字符串"THIS IS '"NOT'" COOL"
如果您尝试执行JSON.parse("THIS IS '"NOT'" COOL")
,它将失败,这是因为JS解析器将把字符串"THIS IS '"NOT'" COOL"
解释为"THIS IS "NOT" COOL"
。
如果执行JSON.parse(JSON.stringify('THIS IS "NOT" COOL'))
,它将起作用,因为字符串"THIS IS '"NOT'" COOL"
直接传递给THIS IS COOL
0。
为什么它在这个场景中有效,而在前一个场景中无效?
我唯一的结论是,eval在执行代码之前明确地取消了所有传递给它的内容,但我想确切地知道这一点,并理解为什么eval被设计成这样工作。
这里的问题是字符转义。看看字符串串联的结果:
"(function() { console.log(JSON.parse('"THIS IS '"NOT'" COOL"')); })()"
请注意,这是实际输出,这是而不是字符串文字。'
在这里是一个字面字符,而不是转义符(我只包含了外引号,表示我谈论的是字符串)。
使用eval
,字符串被评估为以下代码:
(function() {
console.log(JSON.parse('"THIS IS '"NOT'" COOL"'));
})()
此时,'"
实际上被解释为字符转义序列,即字符串literal'"THIS IS '"NOT'" COOL"'
的值为:
"THIS IS "NOT" COOL"
它是一个无效的JSON编码字符串。
因此您得到错误
SyntaxError: Unexpected token N
eval
不会对您传递的字符串执行任何操作,而是按照它获取字符串的方式进行解释。
- 如何在JavaScript中将字符串转换为函数引用
- jsi18n-django.catogue没有'不包含任何已翻译的字符串(但是djangojs.mo包含)
- 使用AngularJS和Angular Translate如何检查字符串是否已被翻译
- 如何在TurboGears中翻译JavaScript字符串
- 如何使用角度翻译处理包含 HTML 的字符串
- 角度翻译服务:字符串中的 HTML 标签
- 使用角度翻译在翻译的字符串中添加<强>/粗体文本
- 具有动态文本和输入的字符串翻译
- MVC-JavaScript翻译中字符串的全球化
- 不是'翻译'字符串正确
- Do eval()首先对求值后的字符串进行字面翻译
- Javascript字符串不翻译'对的
- 如何在js警报上使用i18next显示翻译后的字符串
- 翻译KeyDown键码字符串(jQuery)
- 用django翻译javascript中的多行字符串
- 如何在django的html的脚本标签中翻译javascript中的字符串
- 如何动态翻译JavaScript字符串
- Google API -将字符串翻译成EN语言:(
- i18n翻译字符串的概念映射
- 为什么当html文件从字符串翻译时不调用javascript ?