13

有时我会查看源页面(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);
  • 有什么问题JSON.stringify(["\u2028\u2029"])需要检查?

附加信息 :

  • JSON.stringify(["\u2028\u2029"])值为 "["

"]"
  • '["\u2028\u2029"]'值也是"["

"]"
4

3 回答 3

7

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

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

但事实证明,在 ES5 JavaScript 中,行和段落分隔符\u2028\u2029分别被视为新行。

来自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 代码搜索没有提到任何需要手动添加此解决方法的错误。看起来Firefox 3.5是第一个支持原生 JSON 的版本,但并非完全没有错误。IE8也支持。所以它现在可能是一个不必要的补丁,假设浏览器已经正确地实现了规范。

于 2013-05-22T08:31:29.003 回答
4

阅读两个答案后,这里是简单的视觉解释:

这样做

alert(JSON.stringify({"a":"sddd\u2028sssss"}))// 可能会导致问题

会提醒:

在此处输入图像描述

同时将麻烦制造者更改为其他内容(例如 from \uto \1u

会提醒:

在此处输入图像描述

现在,让我们从我原来的 Q 调用函数,

让我们再试alert(JSON.stringify({"a":"sddd\u2028sssss"})) 一次:

结果 :

在此处输入图像描述

现在,每个人都很高兴。

于 2013-05-22T08:57:13.230 回答
1

\u2028并且\u2029是不可见的 Unicode段落分隔符。本机JSON.stringify方法将这些代码转换为它们的符号表示(就像 JavaScript 自动在字符串中所做的那样),从而生成"["

"]". 您提供的代码不允许 JSON 将代码转换为符号并将它们的\uXXXX表示形式保留在输出字符串中,即返回"["\u2028\u2029"]".

于 2013-05-22T08:18:57.490 回答