Есть ли разница между одинарными / двойными кавычками, передаваемыми в eval javascript? - PullRequest
1 голос
/ 19 декабря 2010

У меня есть серверное сообщение, отправленное через веб-сокеты. это сообщение является строкой json (проверено). когда он попадает в браузер, я проверяю, что это строка с typeof(data), и он говорит мне, что на самом деле это строка. Когда наконец я делаю var some_obj = eval( '(' + data + ')' ); это дает мне ошибку Uncaught SyntaxError: Unexpected token ILLEGAL.

также, перед использованием eval(), я console.log(data), и он отображается правильно, хотя alert(data) ничего не показывает в диалоговом окне.

Я не могу понять, что происходит.

Я также попробовал var myJson = '{ "x": "Hello, World!", "y": [1, 2, 3] }';, а затем var myObj = eval( '(' + myJson + ')' );, и это работает, так что я действительно не могу понять, почему мое не может быть оценено (проанализировано).

строка, полученная через веб-сокеты, выглядит так:

received 37 bytes » { "cmd": "setname", "params": "ok" }

где data = { "cmd": "setname", "params": "ok" } (я полагаю, с кавычками, потому что typeof(data) = строка).

какие-нибудь советы? спасибо

edit1 »с веб-сокетами, вы должны добавить нулевой символ (0 ascii) и добавить escape-символ (255 ascii) к выходной строке с сервера. я предполагаю, что клиент (браузер), поскольку он реализует веб-сокеты, должен иметь дело с этим и правильно развернуть строку (как стандарт) и как я делаю на моем сервере. дело в том, что может остаться какой-нибудь escape-символ, и он неправильно с этим справится. но проблема началась только тогда, когда я попытался отправить строки json в eval () ed. в противном случае они работают как любая другая строка.

1 Ответ

6 голосов
/ 19 декабря 2010

Нет, между " и ' нет никакой разницы в кавычках, кроме того, что вы можете использовать ", не экранируя его внутри строки, заключенной в ', и наоборот. Но я не думаю, что (название вашего вопроса) на самом деле как-то связано с проблемой, с которой вы столкнулись.

Если вы хотите убедиться, что в строке нет символов со значением 0 или 255, вы можете сделать это следующим образом:

data = data.replace(/[\u0000\u00ff]/g, '');

... прежде чем передать его на eval. И это звучит так, как будто вы, возможно, захотите это сделать, поскольку ваша вещь говорит, что она получила 37 байтов, но длина строки составляет всего 36 символов и не использует никаких символов, требующих два байта (или, возможно, в конце просто пробел. не вижу).

Не по теме : Лучше не использовать eval для десериализации JSON. Вместо этого используйте библиотеку, которая обрабатывает это напрямую. У Крокфорда есть две разные не eval библиотеки на его странице github , одна (json_parse.js), которая использует синтаксический анализатор с рекурсивным спуском, и другая (json_parse_state.js), которая использует конечный автомат. Если вы действительно, действительно хотите использовать eval для анализа JSON, взгляните на его реализацию в json2.js, которая, по крайней мере, делает несколько шагов, чтобы отсеять вредоносные файлы.

Не по теме 2 : Re

где data = { "cmd": "setname", "params": "ok" } (я полагаю, с кавычками, потому что typeof (data) = строка).

Мы используем кавычки только для кавычек строковых литералов в коде; нет никаких кавычек вокруг фактических строковых данных в памяти. Если я сделаю это:

var foo = "bar";

... строка, на которую указывает foo, целиком состоит из символов b, a и r. Там нет кавычек; кавычки присутствуют только в коде, чтобы сообщить парсеру, что ниже следует строковый литерал.

...