JSON.parse()、JSON.stringify()和eval()

JSON对象:

var str2 = { "name": "asan", "sex": "man" };

JSON字符串:

var str1 = '{ "name": "deyuyi", "sex": "man" }';

结论:

JSON.parse()是将JSON字符串转换成JSON对象。
JSON.stringify()是将JSON对象转换成JSON字符串。

附注:JSON对象中下面是一样的

{"name":"yangyang"}
{name:"yangyang"}

1.JSON.parse()【从一个JSON字符串中解析出JSON对象】

例子:

//定义一个字符串
var data='{"name":"goatling"}'

//解析对象​
​JSON.parse(data)

结果是:

{name:"goatling"}

2.JSON.stringify()【从一个JSON对象中解析出JSON字符串】

var data={name:'goatling'}

JSON.stringify(data)

结果是:

'{"name":"goatling"}'

3.eval()函数

作用:

  1. eval()函数可计算某个字符串,并执行其中的JavaScript代码
  2. eval()函数还可以将JSON字符串解析为JSON对象,类似于JSON.parse()的功能。

1.使用eval()计算某个字符串,并计算其中的JavaScript代码

eval(string)

参数:

  • string 必需,要计算的字符串,其中含有要计算的JavaScript表达式或要执行的语句。
eval("x=10;y=20;document.write(x*y)");  //output为200
document.write(eval("2+2"));  //output为4
var x=10;
ocument.write(eval(x+17));  //output为27

2.使用eval()函数也可以将JSON字符串解析为对象,这个功能能完成JSON.parse()的功能,但是有不一样的地方

// JSON.parse()
var json = '{"name":"GDT","age":23,"University":"GDUT"}';
var info = JSON.parse(json);    //解析为JSON对象
document.write(info);            //output为[object Object]

//eval()
var json = '{"name":"GDT","age":23,"University":"GDUT"}';
var info = eval('(' + json + ')');  //解析为JSON对象
document.write(info);            //output为[object Object]

注意到eval()还要用一对圆括号将字符串包起来,对此我寻找到比较好的解释就是:

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

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

另外,相对于写法格式严格的JSON.parse()来说,eval()可以解析任何字符串,eval是不安全的,因为eval比较宽松,会有潜在的安全性问题。比如以下代码:

1 var str1 = '{"a":"b"}';
2 document.write(eval("("+str1+")"));   //正常解析为对象
3 var str2 = '{"a": (function(){alert("I can do something bad!");})()}';
4 eval('('+str2+')');                   //可以用来执行木马脚本   

如果用恶意用户在json字符串中注入了向页面插入木马链接的脚本,用eval也是可以操作的,而用JSON.parse()则不必担心这个问题,可见,虽然eval()功能很强大,但是实际用到的机会并不多。

参考文章:

https://www.cnblogs.com/goatling/p/6293692.html
https://www.cnblogs.com/DTBelieve/p/5346603.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值