javascript - 关于eval(data)和eval("("+data+")")
迷茫
迷茫 2017-04-11 12:54:38
[JavaScript讨论组]

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

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
PHP中文网

如果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会直接解析执行语句

PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号