前端面试刷题day4(每日更新前端面试高频考察点)

news/2024/7/19 14:07:54 标签: 面试, js, 前端

码字不易,有帮助的同学希望能关注一下我的微信公众号:Code程序人生,感谢!代码自用自取。

在这里插入图片描述

每天都提供一道关于前端面试中常见的题目。并且我建立了一个QQ群(425554900),QQ群内提供大量面试题目和答案,包括CSDN每日更新的题目答案。欢迎大家加群交流,打卡,共同进步。

今日题目:

说一下深拷贝如何解决循环引用问题?


题解:

看个例子:

function deepCopy(obj) {
  const res = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (typeof obj[key] === "object") {
      res[key] = deepCopy(obj[key]);
    } else {
      res[key] = obj[key];
    }
  }
  return res;
}
var obj = {
  a: 1,
  b: 2,
  c: [1, 2, 3],
  d: { aa: 1, bb: 2 },
};
obj.e = obj;
console.log("obj", obj); // 不会报错

const objCopy = deepCopy(obj);
console.log(objCopy);

从例子中可以看到,当存在循环引用的时候,deepCopy会报错,栈溢出。

  • obj对象存在循环引用时,打印它是不会栈溢出
  • 深拷贝 obj 时,才会导致溢出

循环应用问题解决

  • 即:目标对象存在循环应用时报错处理
    大家都知道,对象的key是不能是对象的。
{{a:1}:2}
// Uncaught SyntaxError: Unexpected token ':'

参考解决方式一:使用weekmap;
解决循环引用问题,我们可以额外开辟一个存储空间,来存储当前对象和拷贝对象的对应关系。

这个存储空间,需要可以存储 key-value 形式的数据,且key 可以是一个引用类型。

我们可以选择 WeakMap 这种数据结构:

  • 检查 WeakMap 中有无克隆过的对象
  • 有,直接返回
  • 没有,将当前对象作为 key ,克隆对象作为 value 进行存储
  • 继续克隆
function isObject(obj) {
  return (typeof obj === "object" || typeof obj === "function") && obj !== null;
}
function cloneDeep(source, hash = new WeakMap()) {
  if (!isObject(source)) return source;
  if (hash.has(source)) return hash.get(source); // 新增代码,查哈希表

  var target = Array.isArray(source) ? [] : {};
  hash.set(source, target); // 新增代码,哈希表设值

  for (var key in source) {
    if (Object.prototype.hasOwnProperty.call(source, key)) {
      if (isObject(source[key])) {
        target[key] = cloneDeep(source[key], hash); // 新增代码,传入哈希表
      } else {
        target[key] = source[key];
      }
    }
  }
  return target;
}

参考解决方式二:
可以用Set,发现相同的对象直接赋值,也可用Map。

const o = { a: 1, b: 2 };
o.c = o;

function isPrimitive(val) {
  return Object(val) !== val;
}
const set = new Set();
function clone(obj) {
  const copied = {};
  for (const [key, value] of Object.entries(obj)) {
    if (isPrimitive(value)) {
      copied[key] = value;
    } else {
      if (set.has(value)) {
        copied[key] = { ...value };
      } else {
        set.add(value);
        copied[key] = clone(value);
      }
    }
  }
  return copied;
}

我会帮大家把每一天的题目和超级详细的答案整理好,欢迎加群领取当日题目答案和以往题目答案。


关注公众号后,回复【前端面试题】,领取大量前端面试题汇总pdf资料
在这里插入图片描述


http://www.niftyadmin.cn/n/1576476.html

相关文章

lombok系列3:lombok的实验类特性

lombok除了已经推荐使用的基本功能,还维护了一个创新型的注解,有些功能有违常规对java认知,或者只支持eclipse,其他IDE支持有问题,甚至某些环境完全不可用。因此没有正式使用。 但是的确很有创意,这些注解已…

ajax、$.ajax、axios和fetch对比及其优缺点梳理

码字不易,有帮助的同学希望能关注一下我的微信公众号:Code程序人生,感谢!代码自用自取。 1.Ajax AJAX 是一种用于创建快速动态网页的技术。 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味…

【Facebook的UI开发框架React入门之八】Image的使用简单介绍(iOS平台)-goodmao

---------------------------------------------------------------------------------------------------React.native是facebook开源的一套基于JavaScript的开源框架,非常方便用来开发移动设备的app。并且,方便及时更新app的UI与数据。也非常方便部署。…

前端面试刷题day5(每日更新前端面试高频考察点)

码字不易,有帮助的同学希望能关注一下我的微信公众号:Code程序人生,感谢!代码自用自取。 每天都提供一道关于前端面试中常见的题目。并且我建立了一个QQ群(425554900),QQ群内提供大量面试题目和…

《opencv学习》 之 OTSU算法实现二值化

主要讲解OTSU算法实现图像二值化: 1.统计灰度级图像中每个像素值的个数。 2.计算第一步个数占整个图像的比例。 3.计算每个阈值[0-255]条件下,背景和前景所包含像素值总个数和总概率(就是分别计算背景和前景下第一步和第二步的 …

前端面试刷题day6(每日更新前端面试高频考察点)

码字不易,有帮助的同学希望能关注一下我的微信公众号:Code程序人生,感谢!代码自用自取。 每天都提供一道关于前端面试中常见的题目。并且我建立了一个QQ群(425554900),QQ群内提供大量面试题目和…

《JAVA8开发指南》第二章采用Lambda表达式(一)

采用Lambda表达式 本章,你将学习到如何采用JAVA8的重要特性Lambda表达式。首先,你要了解“行为参数”这种模式。该模式能够使你写出来的代码适应需求变化。然后,你将看到该模式如何使得Lambda表达式的使用与以往比变得更加简洁。然后&#xf…

前端面试刷题day7(每日更新前端面试高频考察点)

码字不易,有帮助的同学希望能关注一下我的微信公众号:Code程序人生,感谢!代码自用自取。 每天都提供一道关于前端面试中常见的题目。并且我建立了一个QQ群(425554900),QQ群内提供大量面试题目和…