JSON.stringify()和toJSON()不得不说的秘密

发布时间:2018-12-18 作者:一点通


JSON.stringify()是将JavaScript对象或者数组转换成字符串,前提是这个对象是能被转换的。像new Date()这种日期对象理论上是不能被转换的

JSON.stringify({
    now: new Date()
})

但事实上上面的代码并不会报错,而是返回{"now":"2018-08-04T07:26:46.252Z"}这样的值,为什么呢?

其实这里是toJSON()帮了大忙,执行

(new Date()).toJSON()

可以发现也会返回{"now":"2018-08-04T07:26:46.252Z"}这样的值

所以结论是,JSON.stringify()执行的过程中,如果遇到某个值包含toJSON()的方法,则会直接取toJSON()得到的值

接下来我们可以验证一下

var me = {
    name: 'jim'
}

JSON.stringify(me)

上面的代码想必大家都会知道答案{"name":"jim"},那么我们稍微改动一下代码

var me = {
    name: 'jim',
    toJSON(){
        return 'hello'
    }
}

JSON.stringify(me)

会得到什么结果呢?答案是"hello",可见toJSON()确实是决定了JSON.stringify()的取值,而且这种影响是多层级的,接着上面的代码

JSON.stringify({who: me})

会得到{"who":"hello"}