javascript - 传递给 javascript 的 eval 的单引号/双引号字符串之间有区别吗?

标签 javascript json eval websocket

我有一条通过网络套接字发送的服务器消息。该消息是一个 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" }

where data = { "cmd": "setname", "params": "ok"} (我想有引号,因为 typeof(data) 是= 字符串)。

有什么建议吗?谢谢

edit1 » 对于网络套接字,您必须在服务器的输出字符串中添加一个空字符 (0 ascii) 并附加一个转义字符 (255 ascii)。我假设客户端(浏览器)在实现网络套接字时必须处理这个问题并正确解包字符串(作为标准),就像我在我的服务器中所做的那样。问题是,可能还剩下一些转义字符,但无法正确处理。但问题仅在我尝试发送 json 字符串进行评估时才开始()。否则它们可以像任何其他字符串一样正常工作。

最佳答案

不,"' 之间的引用字符串没有区别,除了你可以使用 " 而无需在引用的字符串中转义它与 ' 反之亦然。但我认为(你的问题的标题)实际上与你遇到的问题没有任何关系。

重新编辑,如果要确保字符串中没有值为 0 或 255 的字符,可以这样做:

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

...在将其传递给 eval 之前。听起来你可能想要这样做,因为你的意思是它收到了 37 个字节,但字符串只有 36 个字符长,并且不使用任何需要两个字节的字符(或者它可能只是在末尾有一个空格 I看不到)。

题外话:最好不要使用eval反序列化JSON。相反,使用直接处理它的库。 Crockford 在 his github page 上有两个不同的非eval 库,一个 (json_parse.js) 使用递归下降解析器,另一个 (json_parse_state.js) 使用状态机。如果您真的非常想使用 eval 来解析 JSON,请查看他在 json2.js 中的实现,它至少需要几个步骤来清除恶意内容。

题外话2:回复

where data = { "cmd": "setname", "params": "ok" } (with quotes i suppose, because of typeof(data) being = string).

我们只在代码中使用引号来引用字符串文字;内存中的实际字符串数据本身没有引号。如果我这样做:

var foo = "bar";

...foo 指向的字符串完全由字符 b、a 和 r 组成。没有引号;引号仅在代码中存在,用于告诉解析器后面是字符串文字。

关于javascript - 传递给 javascript 的 eval 的单引号/双引号字符串之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484195/

相关文章:

javascript - 如何根据显示的结果更改 div 背景图像?

javascript - 我如何在 Javascript 中声明类?

javascript - 向 SOAP WSDL 发送请求

haskell - 使用字符串内容调用同名函数

Python:如何在函数的本地范围内运行 eval()

javascript - 根据缩放级别添加或删除多边形

javascript 读取 JSON 文件后无法迭代数组

json - 在 R 中从 JSON 转换为数据帧

java - Android 无法转换为 JSONObject 错误

php - 通过引用翻译变量替换文本中的占位符