背景
记之前遇见的一道面试题,让现场写出 JavaScript 中stringify
函数的实现。首先写一下自己最开始的思路,然后针对里面的一些问题进行逐步修改,并且引出对 JSON 这种轻量级数据传输格式所拥有数据类型的学习与思考。
一、最初实现
首先给定题目
将一个 JSON 格式对象转换为字符串,转换后的结果可以通过
JSON.parse()
方法将该字符串重新转换为一个 JSON 对象。
先简化问题,将数据类型简单划分(并不正确,下文会给描述)为:对象(Object)、数组(Array)和字符串(String)这三种类型。对于 String,只需要简单的对它进行toString()
调用,并包裹在"
中处理,对于前两者则需要采取不同操作。考虑到他们的子元素也是 JSON 对象,定义具有递归性,所以代码也采用递归来实现。最初代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
function isArray () {} function isObject () {} function stringify (obj) { let ret = ''; if (!isObject(obj) && !isArray(obj)) { return '"' + obj.toString() + '"'; } else if (isObject(obj)) { ret += '{'; let keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { let key = keys[i]; ret += '"' + key.toString() + '":'; if (!isObject(obj[key]) && !isArray(obj[key])) { ret += '"' + obj[key].toString() + '"'; } else { ret += stringify(obj[key]); } if (i != keys.length - 1) { ret += ','; } } ret += '}'; } else if (isArray(obj)) { ret += '['; for (let i = 0; i < obj.length; i++) { ret += stringify(obj[i]); if (i != obj.length - 1) { ret += ','; } } ret += ']'; } return ret; } |
代码的思路就是传入一个对象,然后判断它的类型:1. 如果非数组和对象类型,就直接返回它的字符串形式;2. 如果是对象类型,则遍历每个键值对,判断每个键对应值的类型,如果是