Appearance
JSON.stringify
JSON.stringify
方法将一个 JavaScript 对象或值转换为 JSON 字符串,如果指定了一个 replacer 函数,则可以选择性地替换值,或者指定的 replacer 是数组,则可选择性地仅包含数组指定的属性。
- 对象中定义了 toJSON()方法,JSON 字符串化时会首先调用该方法,然后用它的返回值来进行序列化。
js
const obj = {}
obj.toJSON = () => 1
JSON.stringify(obj) // '1'
- 在对象中遇到 undefined、function 和 symbol 时会自动将其忽略,在数组中则会返回 null(以保证单元位置不变)。
js
const obj = { a: 1, b() {}, c: undefined }
const arr = [1, function () {}, undefined]
JSON.stringify(obj) // '{"a":1}'
JSON.stringify(arr) // '[1,null,null]'
- 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。
js
const a = {}
const b = { a }
a.b = b
JSON.stringify(a) /// TypeError...
因此该方法可以用来判断链表是否存在环。
js
function hasRing(links) {
try {
JSON.stringify(links)
return true
} catch (err) {
return false
}
}
- 传递一个可选参数 replacer,它可以是数组或者函数。
如果 replacer 是一个数组,那么它必须是一个字符串数组,其中包含序列化要处理的对象的属性名称,除此之外其他的属性则被忽略。
js
const obj = { name: '张三', age: 18 }
JSON.stringify(obj, ['name']) // '{"name":"张三"}'
如果 replacer 是一个函数,它会对对象本身调用一次,然后对对象中的每个属性各调用一次,每次传递两个参数,键和值。如果要忽略某个键就返回 undefined,否则返回指定的值。
js
const obj = { name: '张三', age: 18 }
JSON.stringify(obj, (key, value) => (key !== 'name' ? value : undefined)) // '{"age":18}'