当前位置:网站首页>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 语句会比较多,但是如果理解返回类型的话,一步一步写下里其实是不难的。
边栏推荐
猜你喜欢
随机推荐
如何进行自动化测试?【Eolink分享】
powershell和cmd对比
机器学习之支持向量机实例,线性核函数 多项式核函数 RBF高斯核函数 sigmoid核函数
TikTok如何为独立站引流?
Dragoma (DMA) Metaverse System Development
入门:人脸专集1 | 级联卷积神经网络用于人脸检测(文末福利)
lc marathon 8.3
Zip4j使用
[Distributed Advanced] Let's fill in those pits in Redis distributed locks.
【HCIP】MPLS WPN 实验
阿里云技术专家秦隆:云上如何进行混沌工程?
VQ Realization of Wavelet Extraction Features
测试/开发程序员男都秃头?女都满脸痘痘?过好我们“短暂“的一生......
win10 uwp win2d 使用 Path 绘制界面
server
【ASP.NET Core】 中间件
How can test engineers break through career bottlenecks?
服务器
当前最快的实例分割模型:YOLACT 和 YOLACT++
PostgreSQL的 SPI_接口函数