1. JSON 和 JavaScript 的关系?
- JSON 并不从属于 JavaScript
 - JSON 是一种数据格式, 而不是编程语言
 - JSON 可表示的数据类型有: 对象/数组/字符串/数字/布尔值/null, 其余类型忽略.
 
2. 除了使用全局对象JSON解析 JSON 还有什么方法? 问题点是?
还有eval()方法可以解析, 问题点是:
eval()中可能有恶意代码- 性能不高
 
支持
JSON的的浏览器, IE8+
3. JSON.stringify(obj)时的注意点?
- 不能保存函数, 如果有函数会忽略
 - 值为
undefined会被忽略 
4. 解释下执行JSON.stringify这个函数发生的内部流程?
var a = {
  str: "string",
  num: 10,
  fn: function fn() {
    console.log("num:", this.num);
  },
  trans: {
    toJSON: function() {
      return "hello";
    }
  },
  arr: [1, 2, 3, 4, 5]
};
console.log(JSON.stringify(a, null, 2));{
  "str": "string",
  "num": 10,
  "trans": "hello",
  "arr": [1, 2, 3, 4, 5]
}流程
- 如果对象中存在 toJSON 方法, 则执行他获得有效值. 否则返回对象本身. (上面例子最外层对象没有)
 - 如果提供了第二个参数, 则执行过滤操作. 传入函数过滤器的(key, value)是第一步返回的值
 - 先从最外层对象开始, 如果内层遍历到对象, 则转到 1)
 - 对第 2)返回的每个值进行序列化
 - 如果提供了第三个参数, 则进行对应格式化
 
注意:
- 可以控制整个对象的 toJSON 之外, 还可以控制某个属性的 toJSON.
 - 第三个参数是格式化参数, 可以是字符串用于填充间隙
 
5. JSON.parse中的还原函数?
var book = {
  title: "Professional JavaScript",
  authors: ["Nicholas C. Zakas"],
  edition: 3,
  year: 2011,
  releaseDate: new Date(2011, 11, 1)
};
var a = JSON.stringify(book);
console.log(
  JSON.parse(a, function(key, value) {
    if (key === "releaseDate") {
      return new Date(value);
    }
    return value;
  })
);JSON.stringify时,Date本身有自己的toJSON方法JSON.parse时, 是不会有上面的逆过程, 需要手动操作, 因为, string 类型的值不知道之前发生了什么…JSON.parse第二个参数成为: 还原函数, 函数传参和JSON.stringify的过滤函数一致(和array.prototype.filter过滤函数的机制不一样, 需注意)
- 本文作者:烈风裘
 - 本文题目:第二十章 JSON
 - 本文链接:https://xiangst0816.github.io/blog/di-20-zhang-json/
 - 版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!