有时我在视图源页面(html视图源)中see这段代码:
if (JSON.stringify(["\u2028\u2029"]) === '["\u2028\u2029"]') JSON.stringify = function (a) {
var b = /\u2028/g,
c = /\u2029/g;
return function (d, e, f) {
var g = a.call(this, d, e, f);
if (g) {
if (-1 < g.indexOf('\u2028')) g = g.replace(b, '\\u2028');
if (-1 < g.indexOf('\u2029')) g = g.replace(c, '\\u2029');
}
return g;
};
}(JSON.stringify);
JSON.stringify(["\u2028\u2029"])
需要检查的问题是什么?其他信息:
JSON.stringify(["\u2028\u2029"])
值为"["
"]"
'["\u2028\u2029"]'
值也是"["
"]"
答案 0 :(得分:7)
我认为这可能是一项安全功能。 2028和2029的FileFormat.info有一个横幅说明
请勿在域名中使用此字符。由于可能存在网络钓鱼,浏览器为blacklisting。
但事实证明,行和段落分隔符\u2028
和\u2029
分别被视为ES5 JavaScript中的新行。
来自http://www.thespanner.co.uk/2011/07/25/the-json-specification-is-now-wrong/
\ u2028和\ u2029可以破坏整个JSON提要的字符,因为该字符串将包含一个新行,并且JavaScript解析器将会挽救
所以你看到了JSON.stringify
的补丁。另请参阅Node.js JavaScript-stringify
编辑:是的,现代浏览器的内置JSON对象应正确处理此问题。我找不到任何指向实际来源的链接来支持这个。 Chromium code search未提及任何可能需要手动添加此变通方法的错误。看起来Firefox 3.5是第一个拥有本机JSON支持的版本,not entirely虽然没有bug。 IE8也支持它。所以它可能是一个现在不必要的补丁,假设浏览器已正确实现了规范。
答案 1 :(得分:3)
阅读完两个答案后,这里是简单的视觉解释:
这样做
alert(JSON.stringify({"a":"sddd\u2028sssss"}))
//可能会导致问题
会提醒:
将问题制定者更改为其他内容(例如从\u
更改为\1u
)
会提醒:
现在,让我们从原来的Q,
调用该函数让我们再试一次alert(JSON.stringify({"a":"sddd\u2028sssss"}))
:
结果:
现在,每个人都很高兴。
答案 2 :(得分:1)