JSON.parse()、JSON.stringify()和eval()的作用

JSON.parse() 函数
作用: 将JavaScript 对象表示法(json)字符串转换成对象
语法: JSON.parse(text, [,reviver])
  参数: text: 必需, 一个有效的 json 字符串
    reviver: 可选。 一个转换结果的函数。 将为对象的每个成员调用此函数 
返回值: 返回一个对象或者数组
 var json = '{"name":"GDT","age":23,"University":"GDUT"}';
var info = JSON.parse(json);  //解析为JSON对象
console.log(json)  // 结果 {"name":"GDT","age":23,"University":"GDUT"}
console.log(typeof info) // 结果 object
 
JSON.stringify() 函数
作用: 将 JavaScript 值转换为 JavaScript 对象的表达式(JSON) 字符串 与 JSON.parse作用相反
语法: JSON.stringify(value, [,replacer] [,space])
参数:
   value: 必需,通常为需要转换的JavaScript值(通常为对象或者数组)
  replacer: 可选,用于转换结果的函数或者数组
  space: 可选。向返回值 JSON 文本添加缩进、空格和换行符以使其更易于读取。
返回值:一个包含JSON文本的字符串
var json = {"name":"GDT","age":23,"University":"GDUT"}
var info = JSON.stringify(json) // 解析为JSON字符串
console.log(info) // 结果 {"name":"GDT","age":23,"University":"GDUT"} 
console.log(typeof info) // string
 
JSON.parse(JSON.stringify(row)) 可以结合使用
JSON.parse(JSON.stringify(obj))我们一般用来深拷贝,其过程说白了 就是利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;序列化的作用是存储(对象本身存储的只是一个地址映射,如果断电,对象将不复存在,因此需将对象的内容转换成字符串的形式再保存在磁盘上 )和传输(例如 如果请求的Content-Typeapplication/x-www-form-urlencoded,则前端这边需要使用qs.stringify(data)来序列化参数再传给后端,否则后端接受不到; ps: Content-Typeapplication/json;charset=UTF-8或者 multipart/form-data 则可以不需要 );我们在使用 JSON.parse(JSON.stringify(xxx))时应该注意一下几点:
 
1、如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象;
2、如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象;
3、如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失
4、如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
5、JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor
6、如果对象中存在循环引用的情况也无法正确实现深拷贝
 
浅拷贝
//浅拷贝,双向改变,指向同一片内存空间
var arr1 = [1, 2, 3];
var arr2 = arr1;
arr1[0] = 'change';
console.log('shallow copy: ' + arr1 + " );   //shallow copy: change,2,3
console.log('shallow copy: ' + arr2 + " );   //shallow copy: change,2,3
 
 
eval() 函数
作用:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
语法:eval(string)
参数:
  string: 必需,要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。
返回值:返回计算string的值,如果有的话 (没有则不做任何改变返回)
 
使用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代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/maxiag/p/13442664.html