- 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 构造函数的最后一个参数作为函数的方法体