本文已参与「 新人创作礼 」活动,一起开启掘金创作之路
说到序列化,反序列化其实很多人大致都是知道。
我们常用的api也有。
JSON.parse("{\"a\":1}"). 在控制台肯定是可以输出 object 类型 { "a" : 1 }
JSON内置队形区域数据机器严谨
JSON.stringify({"a":1}). 控制台得到的值为。'{"a":1}'
如果我们只是为了做业务,这种实现规则大家或许根本不在意,也不会去考虑他的根本实现规则。毕竟原型链 & GC & 内置函数实现,对于业务开发,或许不是那么的重要。
不重要但是不代表不需要掌握。
我们也是对一些常用的要进行了解。
我找的一道别人给我的面试题,我看了下:
let obj = {
a: 11,
b: {
b: 22,
c: {
D: 33,
e: [44,55,66]
}
}
};
把这个object输出为string。
在这里找到这个题目的关键在于数据类型的判断。
尤其是对Object类型的判断。
基础数据类型我们可以根据typeof 就可以得到。
其实就是复杂的object,特别es6出来后,基础数据类型新增了Symbol , 这个时候我们通过stringify来出来,就尴尬了 😅
当使用 JSON.stringify() 时,以 symbol 值作为键的属性会被完全忽略:{}
Symbol('name').toString(). 得到的是 'Symbol(name)'
stringify这种api或许也没有考虑新数据类型的,毕竟es的发展太快了。
下面的看似一段简单的代码,但是却成为了es5~es6 过度过程需要了解的东西。
当然市面很多函数库非常的好用,难免如果出了问题我们也是需要知其所以然。
function json2string(obj) {
let type = typeof obj;
if (type !=='object') {
if(/string|undefined|function/.test(type)){
obj = '"' + obj +'"'
}
return String(obj)
} else {
let isArr = Array.isArray(obj);
let json = []
for (let i in obj) {
let v = obj[i];
let type = typeof v
if (/string|undefined|function/.test(type)) {
v = '"' + v +'"'
} else {
v = json2string(v)
}
json.push((isArr ? "" : '"' + i + '":') + String(v));
}
return (isArr ? "[" : "{") + String(json) + (isArr ? "]" : "}")
}
}
然后我们可以去比较下。
console.log(JSON.stringify(obj) === json2string(obj))
参考代码实例:tool.lu/coderunner/…
PS:每天积累一点点,就是很大的一部分, 保持毅力,总有一天你会得到你想要的高度。