深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
(1)JSON.parse 函数
将JSON字符串转换为对象
(2)JSON.stringify()函数
将 JavaScript 值转换为JSON字符串
(3)eval()函数
作用:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
语法:eval(string)
参数:string 必需,要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。
使用eval()函数也可以将JSON字符串解析为对象,这个功能能完成JSON.parse()的功能,但是有不一样的地方,请看下面代码
// JSON.parse() var json = '{"name":"GDT","age":,"University":"GDUT"}'; var info = JSON.parse(json); //解析为JSON对象 document.write(info); //output为[object Object] //eval() var json = '{"name":"GDT","age":,"University":"GDUT"}'; var info = eval('(' + json + ')'); //解析为JSON对象 document.write(info); //output为[object Object]
eval()还要用一对圆括号将字符串包起来,
原因:归结于eval本身的问题,由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
解决方法:加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。请看下列例子的不同
alert(eval("{}")); // return undefined alert(eval('('+'{}'+')')); // return object[Object]
BUT 如果恶意用户在json字符串中注入了向页面插入木马链接的脚本,用eval是可以操作的,而用JSON.parse()则不必担心这个问题。