js面试题

作者:萨叔偲 | 发布日期:2024-05-06 18:07:27

⒈JS面试题:深浅拷贝简析/手写深拷贝函数

对象类型实际上在赋值过程中复制了地址,导致一端改变,另一端也改变。 在开发中,我们通常不希望出现这样的问题,可以使用这里来解决。

首先,我们可以通过Object.sign实现皮肤复制。 该函数只是将所有属性值复制到新对象。 如果属性值是对象,则会复制地址,这是浅复制而不是深复制。
下面是Object.sign浅拷贝的简单实现:

浅拷贝也可以通过扩展运算符实现...:

但是浅拷贝copy只解决第一级问题,如果该对象下还有对象,则返回原问题。 二级对象仅复制地址,并且它们共享相同的地址。 。

我们通常使用JSON.parse(JSON.stringify(object))来解决:

但是这种方法有以下局限性:

遇到函数时,当使用代码和代码时,它们会被直接忽略,无法正常序列化对象,此时我们需要实现更完整的深拷贝。

总结:上面的深拷贝方法还是比较简单的,想要实现一个比较完美的深拷贝其实是非常困难的,我们需要考虑很多边界情况,比如如何处理原型字符串以及DOM如何处理它等等。 DeepClone函数有两个明显的问题,一是没有解决对象的循环引用问题(参考方案:使用弱映射创建一个哈希表来存储原始对象,如果缓存到达,则过滤这个副本并直接使用保存的数据,否则惰性复制并不能很好地解决IE中的通用兼容性问题如果考虑兼容性,一般需要使用按需shims,直接使用实用程序库,总之,复制on-要求。