Javascript 这里使用eval()是否合理?

Javascript 这里使用eval()是否合理?,javascript,eval,Javascript,Eval,JavaScript对象data有一个属性“amplitudes”,它是一组来自服务器的位掩码数组串接而成的字符串 var data = { "amplitudes": "[1,1,1,4,1,1],[1,1,1,1,1,1],[1,1,4,1,9,1],[1,1,9,1,16,1],[1,32,1,1,1,9],[4,4,4,1,1,1]" } 需要将其分解为六个独立阵列。我将使用split()和eval()的组合,以以下方式完成此任务: var amplit

JavaScript对象
data
有一个属性“amplitudes”,它是一组来自服务器的位掩码数组串接而成的字符串

var data = {
  "amplitudes":           
  "[1,1,1,4,1,1],[1,1,1,1,1,1],[1,1,4,1,9,1],[1,1,9,1,16,1],[1,32,1,1,1,9],[4,4,4,1,1,1]"
}

需要将其分解为六个独立阵列。我将使用
split()
eval()
的组合,以以下方式完成此任务:

var amplitudes = [];
amplitudes = data.amplitudes.split("],[");
for(var i=0;i<amplitudes.length;i+=1){
    (i+1)%2>0 ? amplitudes[i] = amplitudes[i] + "]" : amplitudes[i] = "[" + amplitudes[i];
    amplitudes[i] = eval(amplitudes[i]);
}
var振幅=[];
振幅=数据.振幅.分割(“],[”);
对于(var i=0;i0?振幅[i]=振幅[i]+“]”):振幅[i]=“[”+振幅[i];
振幅[i]=eval(振幅[i]);
}
问题


1) 有没有一种更优雅、更高效的方法?我对eval()的使用不太满意,但感觉split比regex更高效?我还没有运行基准测试

2) 我也乐于处理字段“振幅”存储在数据库中的格式,这样我的总体设计就更简单了


欢迎您的建议

如果您可以更改服务器,只需将“振幅”属性设置为数组数组,而不要用引号将其写出来:

var data = {
  amplitudes: [ [1, 1, 1, 4, 1, 1 ], [ 1, 1, 1, 1, 1, 1 ], ... ]
};

现在,您的客户端根本不需要解码。

因为您可能使用服务器端语言处理数据,所以只需让它生成一个JavaScript数组。如果您的服务器端代码中有一个数组,请使用JSON编码器来构建JavaScript对象/数组

var data = {
  "amplitudes": [[1,1,1,4,1,1], [1,1,1,1,1,1], [1,1,4,1,9,1], [1,1,9,1,16,1], [1,32,1,1,1,9], [4,4,4,1,1,1]]
}
如果无法更改从服务器获得的内容,可以使用eval进行更改,但方法要简单得多:

var str = "[1,1,1,4,1,1],[1,1,1,1,1,1],[1,1,4,1,9,1],[1,1,9,1,16,1],[1,32,1,1,1,9],[4,4,4,1,1,1]";
var arr = eval('[' + str + ']');

与只返回字符串相比,您可以尝试使用JSON直接从服务器传递javascript对象。几乎每种服务器端语言都支持某种形式的JSON编码/解码

eval()函数通常用于解码被认为是“安全”的JSON数据,因为对用户定义的数据使用eval可能会导致XSS攻击。无论如何,您可以通过使用正则表达式匹配数组,然后使用eval解码数组组件,使代码更加优雅:

var matches = data.amplitudes.match(/\[.*?\]/g);
 var amplitudes = [];

 if (matches != null && matches.length > 0) {
  for (var i = 0; i < matches.length; i++) {
   amplitudes[i] = eval(matches[i]);
  }
 }
var matches=data.amplitudes.match(/\[.*?\]/g);
var振幅=[];
if(matches!=null&&matches.length>0){
对于(var i=0;i
我只有一个字段振幅可以将所有位掩码一起保存在数据库中。“振幅”是Json样本Json中发送的许多属性之一:{“选项”:“a,b,c”,“qs_id”:4,“振幅”:“[1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1],“要求”:“1,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2”}存储“振幅”"在数据库中作为这样的字符串?呃。无论如何,在JSON中不需要引用这些值。只要让数组像那样打印出来,JSON解析器就会将其识别为数组值。如果有更好的答案,请等待一段时间,否则我会接受你的答案。这不是很邪恶,因为你没有打开安全漏洞-如果是您的数据,您可能知道它是安全的。这仍然是一个邪恶的问题,因为正确的方法是让您的服务器端代码输出一个JavaScript数组(
json\u encode()
,如果您使用的是PHP)-如果你可以避免eval,那就避免它。@papdel:除非我遗漏了什么,否则ThiefMaster建议使用
JSON
。只有当你无法切换到使用
JSON
@Stephen时,才应该使用他的
eval()
解决方案。谢谢!在服务器端更改了这个选项以发送javascript数组。这避免了eval()并使数据库字段更加优雅。您的解决方案很有效。但是,根据一般反馈,我做了一些表面上的更改,并将服务器端更改为发送javascript数组。因此,我接受了ThiefMasters的建议。无论如何,感谢您的回答,干杯!完全可以接受!服务器端解决方案简洁,所需资源相对较少变化。