JSON.stringify и "\ u2028\u2029" проверить?
Иногда я см. на странице источника просмотра (источник просмотра 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"]'
также является "["
"]"
Ответы
Ответ 1
Я думал, что это может быть функция безопасности. FileFormat.info для 2028 и 2029 есть баннер с сообщением
Не используйте этот символ в именах доменов. Браузеры черный список из-за возможности фишинга.
Но оказывается, что разделители строк и абзацев \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, не совсем без ошибок. IE8 поддерживает его. Таким образом, это, вероятно, теперь ненужный патч, предполагая, что браузеры правильно выполнили спецификацию.
Ответ 2
Прочитав оба ответа, вот простое визуальное объяснение:
делая это
alert(JSON.stringify({"a":"sddd\u2028sssss"}))
//может вызвать проблемы
будет предупреждать:
![enter image description here]()
При изменении создателя проблем на что-то другое (например, от \u
до \1u
)
будет предупреждать:
![enter image description here]()
Теперь позвольте вызывать функцию из моего исходного Q,
Повторите попытку alert(JSON.stringify({"a":"sddd\u2028sssss"}))
:
результат:
![enter image description here]()
и теперь все счастливы.
Ответ 3
\u2028
и \u2029
являются невидимыми Unicode line и абзац разделители. Натурный метод JSON.stringify
преобразует эти коды в их символическое представление (как JavaScript автоматически делает в строках), в результате чего "["
"]"
. Предоставленный вами код не позволяет JSON преобразовывать коды в символы и сохраняет их представление \uXXXX
в выходной строке, т.е. Возвращает "["\u2028\u2029"]"
.