我们正在尝试摆脱JavaScript中所有的eval()
调用。不幸的是,我不是一个JavaScript程序员,我需要一些帮助。
我们的许多eval()
调用都对字符串(来自Web服务的输出)进行操作,这些字符串非常类似于JSON,例如,我们可以评估以下字符串:
ClassMetaData['Asset$Flex'] = {
fields: {
}
,label: 'Flex Fields'
};
我在互联网上看到了各种建议Ext.decode()
。其documentation表示-“将JSON字符串解码(解析)为对象。如果JSON无效,除非设置了安全选项,否则此函数将引发SyntaxError。”据我了解,作为参数提供的字符串不是合法的JSON(未引用字段名称),但是无论如何Ext.decode()
几乎都对我有用。如果我解码上述字符串,则会收到错误消息(为什么?)-“未捕获的SyntaxError:意外的令牌;”。但是,如果我删除结尾的分号并解码,一切似乎都很好。
我正在使用以下代码来确定decode
调用和eval
调用是否执行相同的操作:
var evaled = eval(inputString);
var decoded = Ext.decode(inputString.replace(";", "")); // remove trailing ";", if any
console.log("Equal? - " + (JSON.stringify(decoded) == JSON.stringify(evaled)));
不幸的是,这不是一个很好的解决方案。例如,eval
的某些输入字符串相当复杂。它们可能具有各种嵌入的字符-分号,HTML字符编码等。Decode
可能会抱怨除了分号末尾的其他语法问题,而且我还没有找到确定问题所在的好方法是将对象解码到。 (例如,它没有说“位置67处的非法字符”。)
我的问题:
decode
? eval
比decode
和JSON.stringify(decoded) == JSON.stringify(evaled)
?