面试官:说说你对 ToPrimitive 的理解

170期题目

1. 说说你对 ToPrimitive 的理解
2. 前端有哪些方式可以禁止别人调试自己的前端代码?
3. HTTPS 有哪些优点?

上面问题的答案会在第二天的公众号(程序员每日三问)推文中公布

也可以小程序刷题,已收录500+面试题及答案f8c454fc6345fc50d0a78a17bd7c00ba.jpeg

169期问题及答案

1. 使用 js 实现有序数组原地去重

可以使用JavaScript来实现对有序数组的原地去重。有序数组的去重意味着只保留不重复的元素,并保持数组的顺序。以下是一个简单的实现:

function removeDuplicates(nums) {
  if (nums.length <= 1) {
    return nums;
  }

  let index = 1; // 从第二个元素开始比较
  for (let i = 1; i < nums.length; i++) {
    if (nums[i] !== nums[i - 1]) {
      nums[index++] = nums[i];
    }
  }

  // 截取数组,保留不重复的部分
  nums.length = index;

  return nums;
}

// 示例
const sortedArray = [1, 1, 2, 2, 3, 4, 4, 5, 5];
removeDuplicates(sortedArray);
console.log(sortedArray); // 输出 [1, 2, 3, 4, 5]

这个函数 removeDuplicates 使用双指针的方法,一个指针(index)用于记录当前不重复元素的位置,另一个指针(i)遍历整个数组。如果相邻元素不相等,将当前元素复制到 index 位置,然后 index 自增。最后,通过截取数组的方式保留不重复的部分。

这样处理后,原地去重的数组就保留在 nums 中。注意,这里修改了原数组的长度,因此原数组 sortedArray 的长度会被修改为去重后的长度。如果需要得到新的数组而不改变原数组,可以使用 slice 方法创建一个新的数组。

2. JavaScript 中如何取消请求

在JavaScript中,取消请求通常涉及到使用 XMLHttpRequest 或 Fetch API。以下是两者的不同实现方式:

1. 使用 XMLHttpRequest:

// 创建一个全局变量来保存 XMLHttpRequest 对象
let xhr;

function makeRequest() {
  // 取消之前的请求(如果存在)
  if (xhr) {
    xhr.abort();
  }

  // 创建新的 XMLHttpRequest 对象
  xhr = new XMLHttpRequest();

  // 设置请求信息
  xhr.open('GET', 'https://example.com/api/data', true);

  // 设置请求完成后的回调函数
  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
      // 处理请求结果
      console.log(xhr.responseText);
    }
  };

  // 发送请求
  xhr.send();
}

// 示例取消请求
makeRequest();

在上面的示例中,通过 xhr.abort() 取消之前的请求。请注意,这里使用了一个全局变量 xhr 来存储 XMLHttpRequest 对象,以便在需要时取消请求。

2. 使用 Fetch API:

// 创建一个全局变量来保存 AbortController 对象
let controller;

function makeRequest() {
  // 取消之前的请求(如果存在)
  if (controller) {
    controller.abort();
  }

  // 创建新的 AbortController 对象
  controller = new AbortController();
  const signal = controller.signal;

  // 设置请求信息,使用 signal 作为 options 的 signal
  fetch('https://example.com/api/data', { signal })
    .then(response => response.json())
    .then(data => {
      // 处理请求结果
      console.log(data);
    })
    .catch(error => {
      if (error.name === 'AbortError') {
        // 请求被取消的处理
        console.log('请求被取消');
      } else {
        // 其他错误处理
        console.error(error);
      }
    });
}

// 示例取消请求
makeRequest();

在上面的示例中,通过 controller.abort() 取消之前的请求。使用 Fetch API 时,需要创建一个 AbortController 对象,并将其信号(controller.signal)作为 fetch 方法的 optionssignal。取消请求后,通过捕获 AbortError 错误来处理请求被取消的情况。

3. 说说你对盒子模型的理解

盒子模型是CSS中一个基本概念,用于描述在网页布局中每个元素的尺寸和排列。每个HTML元素被看作一个矩形的"盒子",这个盒子包括内容、内边距、边框和外边距。这四个部分共同构成了一个完整的盒子模型。

具体来说,盒子模型包括以下几个部分:

  1. 内容(Content): 盒子中用于显示实际内容的区域,比如文本、图片等。

  2. 内边距(Padding): 内边距是内容区域与边框之间的空间。内边距可以通过CSS属性padding来设置。

  3. 边框(Border): 边框是内边距外的区域,它围绕在内边距和内容外部。边框的样式、宽度和颜色可以通过CSS属性border来设置。

  4. 外边距(Margin): 外边距是盒子与相邻元素之间的空间,它影响元素与其他元素之间的距离。外边距可以通过CSS属性margin来设置。

在默认情况下,这些部分的尺寸是相对于盒子内容的尺寸来计算的。例如,指定一个元素的宽度为200px,这个200px包括了内容区域的宽度、内边距、边框的宽度,但不包括外边距。

总结一下,盒子模型是CSS布局的基础,它提供了一种理解和控制元素尺寸、间距和边框的方式,使得网页可以按照开发者的期望进行布局和排列。

因为微信公众号修改规则,如果标星或点在看,你可能会收不到我公众号文章的推送,原创不易,请大家将本公众号星标,看完文章后记得点下赞或者在看,谢谢各位!

学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值