当前位置:网站首页>JS手写JSON.stringify() (面试)
JS手写JSON.stringify() (面试)
2022-08-04 19:16:00 【高高不想学习】
作用:
JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串
实现:
要想手写JSON.stringify() ,首先必须了解 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 语句会比较多,但是如果理解返回类型的话,一步一步写下里其实是不难的。
边栏推荐
猜你喜欢
随机推荐
WPF 使用封装的 SharpDx 控件
基于3D机器视觉的采血试管分拣系统
JS 问号?妙用
SOA面向服务架构:服务、服务实例、ARXML、服务接口调用以及各参与方
internship:改了需求
T+Cloud:构建新型生意社交网络和营销关系的“智公司”
MySQL远程备份策略举例
正畸MIA微种植体支抗技术中国10周年交流会在沈举办
win10 uwp DataContext
win10 uwp xaml 绑定接口
ECCV 2022 | FPN错位对齐,实现高效半监督目标检测(PseCo)
HCIA-R&S自用笔记(22)STP状态与计时器、STP拓扑变化、STP配置及实验
我的四周年创作纪念日
Homework 8.3 Thread Synchronization Mutex Condition Variables
openharmony初体验(1)
Notepad++更改显示背景
win10 uwp 使用 Geometry resources 在 xaml
Dragoma(DMA)元宇宙系统开发
curl命令的那些事
VPC2187/8 current mode PWM controller 4-100VIN ultra-wide voltage startup, highly integrated power control chip recommended


![[Sql刷题篇] 查询信息数据--Day1](/img/a7/67b59bd41803dfc07ecb8f00669c29.png)






