常见面试题之 - stringity的实现

109 阅读2分钟

本文已参与「 新人创作礼 」活动,一起开启掘金创作之路

关于如何进行图片优化 - 适合的才是最好的

说到序列化,反序列化其实很多人大致都是知道。

我们常用的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:每天积累一点点,就是很大的一部分, 保持毅力,总有一天你会得到你想要的高度。