关联数组不适用于 eval() JavaScript

Posted

技术标签:

【中文标题】关联数组不适用于 eval() JavaScript【英文标题】:Associative Array does not work with eval() JavaScript 【发布时间】:2011-10-07 23:14:39 【问题描述】:

我正在生成一个表示为 Python 字典的数据,该字典使用 simplejson 通过这种格式的 url 转储。

"2": "London", "3": "Tokyo", "4": "Sydney"

我正在使用$.get 并将其存储到变量数据中。 但是eval(data) 不会生成关联数组。实际上抛出一个错误。问题是什么?解决办法是什么?

编辑:我已经分享了代码 http://dpaste.com/570901/

【问题讨论】:

【参考方案1】:

您的错误是因为在语句开头的 被读取为代码块(就像您在ifs 和fors 中使用的那种),而不是作为对象文字。您可以在 eval 周围加上括号,按照您的意愿进行操作:

eval('(' + str + ')');

当然,eval 是邪恶的,你应该改用 JSON.parse 之类的东西。大多数新浏览器都有这个功能,它不仅更安全,而且速度更快。

【讨论】:

eval 不是邪恶的。 eval 没有道德指南针,实际上没有知觉。 这只是它想让你想的。就在我们说话的时候,Eval 可能正在密谋毁灭人类! 我们计划的是统治世界而不是毁灭......我的意思是......(eval 会杀了我......)【参考方案2】:

我们需要查看更多代码...

var x = '"2": "London", "3": "Tokyo", "4": "Sydney"';

eval('var y = ' + x);
      // or
var y = eval('(' + x + ')');

console.log(y);
console.log(y["2"]);

以上工作正常。你到底在做什么/不做什么?

PS:无论如何你都不应该使用eval,但了解它的工作原理很重要。

【讨论】:

我们不需要再看任何代码了。您的代码有效,因为您正在评估与 OP 不同的东西。请参阅其他一些回复,例如missingno 以获得解释。 @jdigital: eval(data) 与上述eval(x) 同步,我希望你意识到这一点 您正在评估“var y = ... ”,而他正在评估“...”。而且我假设您的意思是“同义词”,而不是“同步”;-) @jdigital:我实际上展示了两种eval'ing 声明的方式。是的,同义词:) 是的,但两者都不同于 OP。无论如何,其他人已经回答了这个问题,而无需查看任何其他代码。也许我对你的第一句话和第二句话读得太多了,所以为什么不简单地说“这里有两种方法可以使这项工作”。【参考方案3】:

eval 速度慢、效率低且难以调试。不要使用它。

让你的脚本输出一个application/json content-type 标头,jQuery 会自动将 JSON 转换为 JS 对象。

【讨论】:

【参考方案4】:

请记住,您正在评估 javascript 代码而不是 JSON。从外观上看,您的字符串将评估为一个块,但第一部分在语法上不正确。 ("2": 接近于带标签的语句,但没有雪茄。)您需要将字符串括在括号中以将其视为对象文字。

【讨论】:

【参考方案5】:

使用 jquery 的 $.get() 函数,您可以告诉它返回一个 json 字符串(将“dataType”设置为“json”),它会为您创建一个对象,不需要 eval()。

【讨论】:

以上是关于关联数组不适用于 eval() JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.x createCriteria 'or' 不适用于嵌套关联

NHibernate 级联删除不适用于一对多关联

使用整数作为关联数组的键在 iOS safari 上不起作用

loadrunner事务判断常用方法

eval作用域

为啥对于每个循环都不适用于 JSON 数组