0

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

eval("(function() { console.log(JSON.parse('" + JSON.stringify('THIS IS COOL') + "')); })()");

它应该打印出来THIS IS COOL,但是,如果你执行这个:

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"是直接传递给JSON.parse.

为什么它在这种情况下有效,但在前一种情况下无效?

我唯一的结论是 eval 在执行代码之前明确地取消了传递给它的所有内容,但我想确定并理解为什么 eval 被设计为这样工作。

4

1 回答 1

2

这里的问题是字符转义。查看字符串连接的结果:

"(function() { console.log(JSON.parse('"THIS IS \"NOT\" COOL"')); })()"

请注意,这是实际输出,而不是字符串文字。\这里是文字字符,而不是转义字符(我只包括了外引号以表示我正在谈论一个字符串)。

使用eval,字符串被评估为以下代码:

(function() { 
    console.log(JSON.parse('"THIS IS \"NOT\" COOL"')); 
})()

此时,\"实际被解释为字符转义序列,即字符串字面量的值为 '"THIS IS \"NOT\" COOL"'

"THIS IS "NOT" COOL"

这是一个无效的 JSON 编码字符串。

因此你得到错误

SyntaxError: Unexpected token N


eval不会对您传递的字符串做任何事情,它会以获取它的方式进行解释。

于 2013-07-02T20:14:06.887 回答