关于eval(data)和eval("("+data+")")

如题,什么时候该加括号什么时候不该加;
今天在改项目的时候,因为是几乎相同功能的模块所以,统一采用了加括号的写法,但是发现,有一个数据图怎么都出不来 报错点击显示([object Object]),外面多了一组小括号,去掉括号,可以正常运行

阅读 12.4k
3 个回答

如果data是字符串,使用eval("("+data+")")可以将其转换为json对象,和JSON.parse的功能一样。
如果datajson对象,使用eval("("+data+")")会报错,正如你描述的错误。eval一个json对象,没有什么作用,这个时候不需要使用eval方法,直接用data即可。

所以,如果你那边能确定后台返回的是字符串,就使用eval("("+data+")")(eval会带来很多问题,不建议使用,如果想实现转化用JSON.parse更好),如果后台返回的是json对象,什么操作都不需要,直接使用data即可。如果你是用的jquery, 将type(一般为这个配置属性)设为json,或者利用$.getJSON()方法获得服务器返回,那么就不需要eval()方法了,因为这时候得到的结果已经是json对象了,只需直接调用该对象即可

另外多说一点
为什么eval要添加括号呢?

原因eval本身的问题。 由于json是以{}的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。

console.log(eval("{}"); // undefined 
console.log(eval("({})");// object[Object] 

eval()在解析字符串参数时,会把参数以执行语句的方式返回,如果你的字符串 解析出来是对象的话(比如说Json字符串) 这时eval在解析的时候会把 对象的括号当成执行语句块的 开始和结束 所以此时需要先多加括号.
如果你的字符串本身就是一段js的执行语句 就不用加括号了 eval会直接解析执行语句

当data是这样的字符串时"{....}",但是你这个{}表示的是一个对象,或者json数据,就要拿()包起来data来,因为当解释器遇到{},它会认为这个是一个代码块,会执行它,所以解释里面的键值对的时候就会报错,如果用()抱起来,就将这个作为一个表达式了,也就可以作为一个对象正常解析了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题