Do eval()首先对求值后的字符串进行字面翻译

Does eval() first makes a literal translation of the evaluated string?

本文关键字:字符串 翻译 eval Do      更新时间:2023-09-26

尝试在浏览器中执行以下代码:

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 COOL0。

为什么它在这个场景中有效,而在前一个场景中无效?

我唯一的结论是,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不会对您传递的字符串执行任何操作,而是按照它获取字符串的方式进行解释。