《JavaScript高级程序设计》读书笔记
语法
JSON 语法支持表示 3 种类型的值。
- 简单值:字符串、数值、布尔值和 null 可以在 JSON 中出现,就像在 JavaScript 中一样。特殊值 undefined 不可以。
- 对象:第一种复杂数据类型,对象表示有序键/值对。每个值可以是简单值,也可以是复杂类型。
- 数组:第二种复杂数据类型,数组表示可以通过数值索引访问的值的有序列表。数组的值可以是任意类型,包括简单值、对象,甚至其他数组。
{
"title": "Professional JavaScript",
"school": {
"name": "Merrimack College",
"location": "North Andover, MA"
},
"authors": [
"Nicholas C. Zakas",
"Matt Frisbie"
]
}
解析与序列化
- JSON.stringify(text):把一个 JavaScript 对象序列化为一个 JSON 字符串,会输出不包含空格或缩进的 JSON 字符串
- JSON.parse(jsonText):接受JSON 字符串,转化为js值
序列化选项
JSON.stringify()方法除了要序列化的对象,还可以接收两个参数。一个是过滤器,可以是数组或函数;另一个是用于缩进结果JSON字符串的选项。
1. 过滤结果
如果是数组:返回包含该数组中列出的对象属性。
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017
};
JSON.stringify(book, ["title", "edition"]);
// '{"title":"Professional JavaScript","edition":4}'
如果是函数:提供的函数接收两个参数:属性名( key)和属性值( value)。可以根据这个 key 决定要对相应属性执行什么操作。
JSON.stringify(book, (key, value) => {
switch(key) {
case "authors":
return value.join(",")
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
});
// '{"title":"Professional JavaScript","authors":"Nicholas C. Zakas,Matt Frisbie","year":5000}'
2. 字符串缩进
第三个参数控制缩进和空格。
如果是数值时,表示每一级缩进的空格数。
JSON.stringify(book, null, 4);
如果是字符串,那么就不是用空格来缩进而是用该字符串。最多10个字符,超出截断。
JSON.stringify(book, null, "--" );
// '{\n--"title": "Professional JavaScript",\n--"authors": [\n----"Nicholas C. Zakas",\n----"Matt Frisbie"\n--],\n--"edition": 4,\n--"year": 2017\n}'
3. toJSON() 方法
自定义JSON 序列化。这个对象会被序列化为简单字符串而非对象。
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017,
toJSON: function() {
return this.title;
}
};
JSON.stringify(book);
// '"Professional JavaScript"'
执行JSON.stringify() 如下步骤:
- 如果可以获取实际的值,则调用 toJSON()方法获取实际的值,否则使用默认的序列化。
- 如果提供了第二个参数,则应用过滤。传入过滤函数的值就是第(1)步返回的值。
- 第(2)步返回的每个值都会相应地进行序列化。
- 如果提供了第三个参数,则相应地进行缩进。
解析选项
JSON.parse()方法也可以接收一个额外的参数,这个函数会针对每个键/值对都调用一次。也接收两个参数,属性名( key)和属性值( value),另外也需要返回值。如果还原函数返回 undefined,则结果中就会删除相应的键。
let book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas",
"Matt Frisbie"
],
edition: 4,
year: 2017,
releaseDate: new Date(2017, 11, 1)
};
let jsonText = JSON.stringify(book);
JSON.parse(jsonText,(key, value) => key == "releaseDate" ? new Date(value) : value);