关联数组不适用于 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】:您的错误是因为在语句开头的 被读取为代码块(就像您在
if
s 和for
s 中使用的那种),而不是作为对象文字。您可以在 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' 不适用于嵌套关联