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