JSON.stringify() & JSON.parse() 实现

  • Boolean | Number | String 类型会自动转换成对应的原始值.
  • undefined、任意函数以及symbol,会被忽略(出现在非数组对象的属性值中时),或者被转换成 null(出现在数组中时).
  • 不可枚举的属性会被忽略
  • 如果一个对象的属性值通过某种间接的方式指回该对象本身,即循环引用,属性也会被忽略.
function jsonStringify(obj){
  function test(type){
    var reg = /string|undefined|function/
    return reg.test(type)
  }
  if(typeof obj == 'object'){
    let json = []
    let isArr = Array.isArray(obj)
    for(let key in obj){
      let value = obj[key]
      let type = typeof value
      if(test(type)){
        value = '"' + value + '"'
      }else if(type ==='object'){
        value = jsonStringify(value)
      }
      json.push((isArr ? "" : '"' + key + '":') + String(value));
      console.log('json',json)
    }
    return (isArr ? "[" : "{") + String(json) + (isArr ? "]" : "}")
  }
}

JSON.parse 实现

  • 使用eval()
  • var json = (new Function("return" + jsonStr))()
  • 实现原理:Function 构造函数的最后一个参数作为函数的方法体
posted @ 2020-05-26 12:54  671_MrSix  阅读(224)  评论(0编辑  收藏  举报