探究JavaScript前端热点面试题(三):让你在面试中游刃有余!

简介: 探究JavaScript前端热点面试题(三):让你在面试中游刃有余!

探究 JavaScript 前端热点面试题(三):让你在面试中游刃有余!

1. 什么是 BOM 和 DOM?

  • DOM:文档对象模型,指把文档当做了一个对象,这个对象中包含了处理网页的方法和接口
  • BOM:浏览器对象模型,把浏览器当成了一个对象,这个对象主要定义了与浏览器交互的方法和接口,BOM 的核心是 window, 而 window 具有双重角色,既是通过 js 调用浏览器窗口的一个接口,也是一个 Global 对象。这也就意味着在网页中定义的任何对象,变量和函数,都会作为全局对象的一个属性或方法存在。

2. for...in 和 for...of 的区别?

  • for...of 是 ES6 新增的遍历方式,可遍历数组和对象等。for...in 是 ES3 出现的。
  • 对于数组来说:for in 和 for of 都可以循环数组,for…in 输出数组的索引 index。for...of 输出数组每一项的值。
  • 对于对象来说:for in 可以遍历对象,for of 不能遍历对象,只能遍历带有 iterator 接口的,例如 Set,Map,String,Array
  • 总结:
  1. 1. for...in 主要遍历对象,不适用于遍历数组。for...of 可用来遍历数组,类数组,字符串,Set, Map 以及 Generator 对象。
  2. 2. 主要区别在于他们的迭代方式不同

3. ajax, axios, fetch 的区别?

  • ajax: 一个 JavaScript 技术,内部基于 XHRHttpRequest 来实现
  • axios: 一个请求框架,也是基于 XHRHttpRequest 封装和 promise 对象,支持同步和异步,提供了较多方法
  • fetch: 一个原生请求 API,基于 Promise 来实现
  • ajax 没有自动转换数据类型的机制,而 axios 和 fetch 支持自动将返回的数据转换为 JSON 数据格式或其他类型
  • ajax: 一种创建交互式网页的开发技术,可做到无需重新加载整个网页的情况下,更新部分网页,也叫局部更新。
  • 缺点:
  1. 1. 原生支持 XHR,但 XHR 架构不清晰
  2. 2. 不符合分离原则
  3. 3. 配置和调用费用混乱,基于事件的异步模型处理不友好
  • axios: 一个基于 promise 的 HTTP 库,可用在浏览器和 node.js 中。
  • 特点:
  1. 1. 浏览器端发起 XMLHttpRequests 请求
  2. 2. node 端发起 http 请求
  3. 3. 支持 promise API3.支持 promise API
  4. 4. 监听请求和返回
  5. 5. 取消请求
  6. 6. 自动转换 json 数据
  7. 7. 客户端抵御 XSRF 攻击
  • fetch: 不是基于 ajax 的封装,而是原生 js, 没有使用 XMLHttpRequests 对象
  • 优点:
  • 缺点:
  1. 1. 只对网络请求报错,对 400,500 都当做成功的请求,不会进行 reject 处理,只有网络错误导致请求错误,才会被 reject。
  2. 2. 默认不携带 cookie, 不支持超时控制,使用 setTimeout 及 Promise.reject 的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费
  3. 3. 没有办法检测请求的进度,而 XHR 可以。
  4. 1. 语法简洁,更加语义化
  5. 2. 基于 promise 实现,支持 async/await
  6. 3. 更加底层,API 丰富
  7. 4. 脱离 XMLHttpRequest

4. 常见的位运算?

  • 判断一个数的奇偶性
  • 奇数:返回 1
  • 偶数:返回 0
console.log(7 & 1); // 1
console.log(8 & 1); // 0
  • 向下取整
// 不能对负数取整
console.log(~~11.71); // 11
console.log(11.71 >> 0); // 11
console.log(11.71 << 0); // 11
console.log(11.71 | 0); // 11
console.log(6.83 >>> 0); // 6
  • 取中间值
console.log(12 >> 1); // 6
  • 判断一个数是否等于目标数
let a = 4654;
// 如何和目标数相等,则等于 0,否则等于其他数
if (a ^ 1171) {
    // 不等于的情况
    console.log(12);
} else {
    // 等于的情况
    console.log(34);
}
  • 判断一个数是不是 2 的整数次幂, 如果是 0,则说明这个数是 2 的整数次幂
n & (n - 1);
// 是 0 则是 2 的整数次幂,不是则返回其他数
console.log(16 & (16 - 1)); // 0
console.log(15 & (15 - 1));
  • 判断一个值是否存在
// before
if (arr.indexOf(item) > -1) {
    // code
}
// 按位非:item 将会转换为 string 类型进行查找
if (~arr.indexOf(item)) {
    // code
}
  • 求一个数的相反数
// 求负数的相反数
console.log(~-n + 1); // n
// 求正数的相反数
console.log(~n + 1); // -n
  • 求一个数的倍数
console.log(8 << 1); // 16
console.log(7 << 1); // 14
  • 求一个数的平方
console.log(2 << 2); // 8
  • 求一个数的立方
console.log(2 << 4); // 16

5. 模块化 ESM, CMJ?

参考:https://juejin.cn/post/6938581764432461854

  • CMJ: 使用 module.exports 导出变量和函数,可导出任意类型的值,使用 require 来导入
  • 导出:module.exports、exports
// 导出一个对象
module.exports = {
    name: '蛙人',
    age: 24,
    sex: 'male',
};
// 导出任意值
module.exports.name = '蛙人';
module.exports.sex = null;
module.exports.age = undefined;
// 直接导出,省略 module 关键字
exports.name = '蛙人';
exports.sex = 'male';
exports = {
    name: '蛙人',
};
  • 导入:
// 直接导入
let data = require('./index.js');
let { name, age } = require('./index.js');
console.log(data); // { name: "蛙人", age: 24 }
console.log(name, age); // 蛙人,24
// 动态导入
let lists = ['./index.js', './config.js'];
lists.forEach(url => require(url)); // 动态导入
if (lists.length) {
    require(lists[0]); // 动态导入
}
  • 导入值的变化:CommonJs 导入的值是拷贝的,所以可以修改拷贝值,但这会引起变量污染,一不小心就重名。
// index.js
let num = 0;
module.exports = {
    num,
    add() {},
};
let { num, add } = require('./index.js');
console.log(num); // 0
add();
console.log(num); // 0
num = 10;

ESM:导出分两种:单个导出 export,默认导出 export default, 导入使用 import...from

  • 导出:
// 导出变量
export const name = "蛙人"
export const age = 24
// 导出函数也可以
export function fn() {}
export const test = () => {}
// 如果有多个的话
const name = "蛙人"
const sex = "male"
export { name, sex }
// 混合导出
export const name = "蛙人"
export const age = 24
export default {
    fn() {},
    msg: "hello 蛙人"
}
  • 导入:
// index,js
export const name = '蛙人';
export const age = 24;
import { name, age } from './index.js';
console.log(name, age); // "蛙人" 24
// 如果里面全是单个导出,我们就想全部直接导入则可以这样写
import * as all from './index.js';
console.log(all); // {name: "蛙人", age: 24}
// 混合导入
// index,js
export const name = '蛙人';
export const age = 24;
export default {
    msg: '蛙人',
};
// index2.js
import msg, { name, age } from './index.js';
// 起别名
import { default as all, name, age } from './index.js';
console.log(msg); // { msg: "蛙人" }
  • 导入值的变化:export 导出的值是值的引用,并且内部有映射关系,这是 export 关键字的作用。而且导入的值,不能进行修改也就是只读状态。
// index.js
export let num = 0;
export function add() {
    ++num;
}
import { num, add } from './index.js';
console.log(num); // 0
add();
console.log(num); // 1
num = 10; // 抛出错误
// ESM 中的 import 在文件最顶部,不可动态加载
  • 区别:
  • CMJ:· CMJ:
  • ESM:·无害环境管理:
  1. 1. ESM 是静态的,不可以动态导入,只能声明在文件最顶部
  2. 2. 可混合导出,单个导出,默认导出,完全不受影响
  3. 3. 导出的值之间存在映射关系,所有值都只是可读的,不可修改。
  4. 1. 可动态加载,代码发生在运行时
  5. 2. 可混合导出
  6. 3. 导出的值是拷贝,可修改导出的值。

6. forEach 与 map 方法的区别?

  • 相同点:
  1. 1. 都是用来遍历数组的
  2. 2. 都支持三个参数: item 当前每一项, index 索引值, arr 原数组
  • 不同点:
  1. 1. forEach 对每一个元素都执行操作,会改变原数组,没有返回值
  2. 2. map 不改变原数组,返回一个新数组
  3. 3. 总的速度来说,map 的速度优先于 forEach,性能上来说:for > forEach > map


特殊字符描述

问题标注 Q:(question)答案标注 R:(result)注意事项标准:A:(attention matters)详情描述标注:D:(detail info)总结标注:S:(summary)分析标注:Ana:(analysis)提示标注:T:(tips)

相关文章
|
19天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
JSON JavaScript 前端开发
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
本文介绍了JSONP的工作原理及其在解决跨域请求中的应用。首先解释了同源策略的概念,然后通过多个示例详细阐述了JSONP如何通过动态解释服务端返回的JavaScript脚本来实现跨域数据交互。文章还探讨了使用jQuery的`$.ajax`方法封装JSONP请求的方式,并提供了具体的代码示例。最后,通过一个更复杂的示例展示了如何处理JSON格式的响应数据。
33 2
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
31 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
1月前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
41 1
|
1月前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
30 1
|
1月前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
65 1
|
1月前
|
前端开发 JavaScript UED
"前端小技巧大揭秘:JS如何将后台时间戳秒变亲切小时前、分钟前,让用户秒懂,提升互动体验!"
【10月更文挑战第23天】在Web开发中,将后台返回的时间戳转换为“小时前”、“分钟前”、“刚刚”等友好的时间描述是常见需求。本文介绍如何用JavaScript实现这一功能,通过计算当前时间和时间戳的差值,返回相应的描述,提升用户体验。
31 1
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
160 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
45 0