170期题目
1. 说说你对 ToPrimitive 的理解
2. 前端有哪些方式可以禁止别人调试自己的前端代码?
3. HTTPS 有哪些优点?
上面问题的答案会在第二天的公众号(程序员每日三问)推文中公布
也可以小程序刷题,已收录500+面试题及答案
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
方法的 options
的 signal
。取消请求后,通过捕获 AbortError
错误来处理请求被取消的情况。
3. 说说你对盒子模型的理解
盒子模型是CSS中一个基本概念,用于描述在网页布局中每个元素的尺寸和排列。每个HTML元素被看作一个矩形的"盒子",这个盒子包括内容、内边距、边框和外边距。这四个部分共同构成了一个完整的盒子模型。
具体来说,盒子模型包括以下几个部分:
内容(Content): 盒子中用于显示实际内容的区域,比如文本、图片等。
内边距(Padding): 内边距是内容区域与边框之间的空间。内边距可以通过CSS属性
padding
来设置。边框(Border): 边框是内边距外的区域,它围绕在内边距和内容外部。边框的样式、宽度和颜色可以通过CSS属性
border
来设置。外边距(Margin): 外边距是盒子与相邻元素之间的空间,它影响元素与其他元素之间的距离。外边距可以通过CSS属性
margin
来设置。
在默认情况下,这些部分的尺寸是相对于盒子内容的尺寸来计算的。例如,指定一个元素的宽度为200px,这个200px包括了内容区域的宽度、内边距、边框的宽度,但不包括外边距。
总结一下,盒子模型是CSS布局的基础,它提供了一种理解和控制元素尺寸、间距和边框的方式,使得网页可以按照开发者的期望进行布局和排列。
因为微信公众号修改规则,如果不标星或点在看,你可能会收不到我公众号文章的推送,原创不易,请大家将本公众号星标,看完文章后记得点下赞或者在看,谢谢各位!
学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。