尝试在浏览器中执行以下代码:
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 被设计为这样工作。