JSON新方法

eval()

eval 可以解析任何字符串变成 JS:

1
2
3
var str = "function testFunction() {console.log('test');}"
eval(str)
testFunction() //'test'

JSON.parse()

JSON.parse 只能解析 JSON 形式的字符串变成 JS,安全性比 eval 高一些。
字符串中的属性要严格加上引号

1
2
3
let str = '{ "name" : "hello" }'
let json = JSON.parse(str)
json.name //'hello'

JSON.stringify()

JSON.stringify 将 JSON 转换成字符串:

1
2
3
4
5
let json = {
name: "hello",
}
let str = JSON.stringify(json)
str //{"name":"hello"}

复制对象出现的问题

由于=赋值,会有引用的问题,新对象属性改变可能会影响到源对象:

1
2
3
4
5
6
let a = {
name: "hello",
}
let b = a
b.name = "hi"
a.name //'hi'

可以用 JSON 的新方法解决:

1
2
3
4
5
6
let a = {
name: "hello",
}
let b = JSON.parse(JSON.stringify(a))
b.name = "ni"
a.name //'hello'

JS 历史管理

触发历史管理的方法:

  • 通过跳转页面
  • hash
  • pushState

Update at 2021/6/24

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
let room = { number: 23 }
let meetup = {
title: "Conference",
participants: [{ name: "John" }, { name: "Alice" }],
place: room,
}

room.occupiedBy = meetup // circular reference

console.log(
JSON.stringify(
meetup,
(key, value) => {
return key === "occupiedBy" ? undefined : value
},
2
)
)

let toJson = {
age: 32,
toJSON() {
return this.age
},
}

console.log(JSON.stringify(toJson))