扫码关注官方订阅号
如题,什么时候该加括号什么时候不该加;今天在改项目的时候,因为是几乎相同功能的模块所以,统一采用了加括号的写法,但是发现,有一个数据图怎么都出不来 报错点击显示([object Object]),外面多了一组小括号,去掉括号,可以正常运行
业精于勤,荒于嬉;行成于思,毁于随。
如果data是字符串,使用eval("("+data+")")可以将其转换为json对象,和JSON.parse的功能一样。如果data是json对象,使用eval("("+data+")")会报错,正如你描述的错误。eval一个json对象,没有什么作用,这个时候不需要使用eval方法,直接用data即可。
data
eval("("+data+")")
json
JSON.parse
eval
所以,如果你那边能确定后台返回的是字符串,就使用eval("("+data+")")(eval会带来很多问题,不建议使用,如果想实现转化用JSON.parse更好),如果后台返回的是json对象,什么操作都不需要,直接使用data即可。如果你是用的jquery, 将type(一般为这个配置属性)设为json,或者利用$.getJSON()方法获得服务器返回,那么就不需要eval()方法了,因为这时候得到的结果已经是json对象了,只需直接调用该对象即可
jquery
type
$.getJSON()
eval()
另外多说一点:为什么eval要添加括号呢?
原因:eval本身的问题。 由于json是以{}的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
{}
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
JavaScript
(expression)
(statement)
console.log(eval("{}"); // undefined console.log(eval("({})");// object[Object]
eval()在解析字符串参数时,会把参数以执行语句的方式返回,如果你的字符串 解析出来是对象的话(比如说Json字符串) 这时eval在解析的时候会把 对象的括号当成执行语句块的 开始和结束 所以此时需要先多加括号.如果你的字符串本身就是一段js的执行语句 就不用加括号了 eval会直接解析执行语句
当data是这样的字符串时"{....}",但是你这个{}表示的是一个对象,或者json数据,就要拿()包起来data来,因为当解释器遇到{},它会认为这个是一个代码块,会执行它,所以解释里面的键值对的时候就会报错,如果用()抱起来,就将这个作为一个表达式了,也就可以作为一个对象正常解析了
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
如果
data是字符串,使用eval("("+data+")")可以将其转换为json对象,和JSON.parse的功能一样。如果
data是json对象,使用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代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。eval()在解析字符串参数时,会把参数以执行语句的方式返回,如果你的字符串 解析出来是对象的话(比如说Json字符串) 这时eval在解析的时候会把 对象的括号当成执行语句块的 开始和结束 所以此时需要先多加括号.
如果你的字符串本身就是一段js的执行语句 就不用加括号了 eval会直接解析执行语句
当data是这样的字符串时"{....}",但是你这个{}表示的是一个对象,或者json数据,就要拿()包起来data来,因为当解释器遇到{},它会认为这个是一个代码块,会执行它,所以解释里面的键值对的时候就会报错,如果用()抱起来,就将这个作为一个表达式了,也就可以作为一个对象正常解析了