明天又又面试字节了,这次倒在了二面,至多比上次更进一步吧,心愿将来有去大厂开开眼的机会。说说明天的一道面试题吧。
JSON.stringfy() 的 circular structure
让咱们先来假如这样一个场景
let b = {}, c = {};
let a = {b : b, c : c};
b.d = a;
JSON.stringify(a);
JSON.stringify()
的后果会是什么呢?后果是 Uncaught TypeError: Converting circular structure to JSON
。因为在 b
对象中存在对 a
对象的援用。这个 ???? 是这样,但触类旁通精确地演绎出 circular structure 的条件也是个不小的挑战,举荐大家进展一下思考一会。。。答案是当子对象对父对象援用时,如果用树形结构图来形容的的话就是。
图中 (1) 和(2)会导致循环构造,而 (3) 不会
基本思路
弄清楚会导致循环构造报错的条件后这个问题就没有那么简单了,但面试的时候却卡在了这里,只能说画好图很重要吧。。。直观的做法是用递归的形式深度遍历并保留门路上的父节点。举例来说,当遍历到 d
时,parents = [a,b]
。同时不要遗记遍历完 d
返回的时候打消副作用,也就是删除增加的点 b
,这在很多须要输入门路的二叉树遍历中都是很重要却又容易遗记的一步
上代码喽
function circularRefference(obj){let initArr = [obj];
return circularRefferenceHelper(obj,initArr);
}
function circularRefferenceHelper(obj,parents){for(let key in obj){if (typeof obj[key] === 'object'){if(parents.includes(obj[key])){return true;}else{parents.push(obj[key]);
let res = circularRefferenceHelper(obj[key],parents);
parents.pop();
if (res){return res;}
}
}
}
return false;
}
彩蛋
学了 js 半年,之前都是感觉 js 的弱类型和动态化大法好,明天面试的时候也算是被上了一课了。['1','2','3'].map(parseInt)
的输入会是多少呢?如果和我一样还没发现这是个坑的能够去跑一下。至于后果为什么这样提醒从 parseInt
的参数个数还有 map
内函数的参数个数的找找起因。