JSON.stringify和"\ u2028\u2029"检查?

Roy*_*mir 13 javascript json

有时候,我看到在查看源代码网页(HTML查看源)这样的代码:

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);
Run Code Online (Sandbox Code Playgroud)
  • JSON.stringify(["\u2028\u2029"])需要检查的问题是什么?

附加信息 :

  • JSON.stringify(["\u2028\u2029"]) 价值是 "["??"]"
  • '["\u2028\u2029"]' 价值也是 "["??"]"

and*_*dyb 7

我认为这可能是一个安全功能.2028年2029年的 FileFormat.info 有一个横幅说明

不要在域名中使用此字符.由于存在网络钓鱼的可能性,浏览器将其列入黑名单.

但事实证明,行和段落分隔符\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对象应该正确处理这个问题.我找不到任何指向实际来源的链接来支持这个.该铬代码搜索并没有提到这将保证手动添加这一解决办法的任何错误.看起来Firefox 3.5是第一个拥有原生JSON支持的版本,但并非完全没有 bug.IE8也支持它.因此,假设浏览器正确实现了规范,它可能是一个现在不必要的补丁.