JS手写JSON.stringify() (面试)

作用:

JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串

实现:

要想手写JSON.stringify() ,首先必须了解 typeof 对于不同类型的返回值。

typeof返回值
类型返回值
String’string'
Number'number
Boolean'boolean'
Symbol'symbol'
Object'object'
Function'function'
Undefined'undefined'

其中是function也属于对象范畴,只不过typeof返回的时候是返回 function,而且 null 不属于object,但是typeof null  返回的还是 object (不要纠结为什么)

首先先展示一下代码吧:(博主测试过了,应该是没有什么问题的)

function _stringify(obj) {
    let type = typeof obj;
    if (type !== 'object') {//非object
        //处理特殊的数字
        if (Number.isNaN(obj) || obj == Infinity || obj == -Infinity) {
            return 'null'
        }
        if (type == 'symbol' || type == 'undefined' || type == 'function') {
            return 'undefined'
        }
        //处理字符串
        if (type == 'string') {
            return `"${obj}"`
        }
        return obj;
    }
    //属于object的
    //处理null
    if (type == 'null') {
        return 'null'
    }
    //处理Date类型
    if (obj.toJSON && typeof obj.toJSON() == 'function') {
        return _stringify(obj);
    }
    //处理正则表达式
    if (obj instanceof RegExp) {
        return "{}"
    }
    //处理数组
    if (Array.isArray(obj)) {
        let result = [];
        obj.forEach((item, index) => {
            let type = typeof item;
            if (type == 'symbol' || type == 'undefined' || type == 'function') {
                result[index] = 'null'
            }
            else {
                result[index] = _stringify(item)
            }
        })
        return `[${result}]`.replace(/'/g, '"');
    } else {
    //处理对象
        let result = [];
        for (const key in obj) {
            if (typeof key !== 'symbol') {
                let type = typeof obj[key];
                if (type !== 'symbol' || type !== 'undefined' || type !== 'function') {
                    result.push(`"${key}":${_stringify(obj[key])}`);
                }
            }
        }

        return `{${result}}`.replace(/'/g, '"');
    }
}

注意点:

正常情况下 symbol  function undefined 这三种类型经过 stringify 表现为 undefined

数组中 symbol  function undefined 这三种类型表现为 null ,

对象的键若是 symbol 则对象的这个属性就被抛弃,

对象的值若是 symbol  function undefined 则这个值也被抛弃

replace(/'/g, ' " ') 这一步是为了将 单引号 全部转换为 双引号

验证:

返回true,与原生是相同的

 总结:

手写这个函数难点就在于各种类型的判断,if else 语句会比较多,但是如果理解返回类型的话,一步一步写下里其实是不难的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值