zoukankan      html  css  js  c++  java
  • 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代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    二次离线莫队
    一些不等积分的练习(持续更新)
    杂题20210427
    杂题20210415
    杂题20210203
    php pack()函数详解与示例
    SHOI2020抱灵祭
    BJOI2021游记+题解
    博客搬家
    听课记录 210220【分治,树分治,CDQ分治】
  • 原文地址:https://www.cnblogs.com/maxiag/p/13442664.html
Copyright © 2011-2022 走看看