eval(); //此方法不推荐前端
JSON.parse(); //推荐方法json
1、两种方法的区别测试
咱们先初始化一个json格式的对象:字体
var jsonDate = '{ "name":"周星驰","age":23 }'spa
var jsonObj = eval( '(' + jsonDate + ')' ); // eval();方法对象
var jsonObj = JSON.parse( jsonDate ); // JSON.parse(); 方法开发
而后在控制台调用:字符串
console.log( jsonObj.name ); // 两种方法均可以正确输入 周星驰console
那么问题来了 两种方法有什么区别呢?(下面咱们稍微把代码改动一下,蓝色字体为修改部分)效率
var jsonDate = '{ "name":alert("hello"),"age":23 }'
var jsonObj = eval( '(' + jsonDate + ')' ); // eval();方法
console.log( jsonObj.age ); //会先执行“alert”输出“hello” 而后才输出 23
换“JSON.parse();”方法:
var jsonDate = '{ "name":alert("hello"),"age":23 }'
var jsonObj = JSON.parse( jsonDate ); // JSON.parse(); 方法
cosole.log( jsonobj.age ) // 报错 这个错误告诉咱们这个字符串是不合法的
小结:“eval();”方法解析的时候不会去判断字符串是否合法,并且json对象中的js方法也会被执行,这是很是危险的;而“JSON.parse();”方法的优势就不用多说了,推荐此方法。(不明白的盆友能够本身在控制台测试一下)
2、扩展问题
var jsonDate = '{ "name":"周星驰","age":23 }'
你们能够看到在上面测试时一直用红色把包在花括号外面的引号标注了起来,这对引号是很关键却又是经常被忽略的,由于 “eval();” 和 “JSON.parser();” 这两个方法的参数只接受字符串,也就是说只能解析字符串!!
那我不经会有一个思考,咱们在初始化的时候若不加引号对,那么它自己就是对象,js能够直接获取对象自己的属性和方法;为何还要加引号将它变成字符串以后再用 “eval();” 或者 “JSON.parse();” 解析,这样作不是既不环保又没有效率吗?
缘由很简单:前端提供给后台的只能是字符串数据格式,后台返回给前台的就看返回的是什么数据格式,是字符串就必须解析以后再用。
(这个小问题通常你们都会忽略掉,不太关注。我之因此好奇的缘由也是由于对后台了解的不够,把这个问题抛出来但愿对后台不熟的朋友有所帮助,知道是怎么回过后天然而然会加深记忆,在开发过程当中就不会漏掉了)