探究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)

目录
相关文章
|
11月前
|
JavaScript 前端开发 API
|
自然语言处理 JavaScript 前端开发
当面试官再问我JS闭包时,我能答出来的都在这里了。
闭包(Closure)是前端面试中的高频考点,广泛应用于函数式编程中。它不仅指函数内部定义的函数,还涉及内存管理、作用域链和垃圾回收机制。闭包可以让函数访问其外部作用域的变量,但也可能引发内存泄漏等问题。通过合理使用闭包,可以实现模块化、高阶函数和回调函数等应用场景。然而,滥用闭包可能导致代码复杂度增加、调试困难以及潜在的性能问题。为了避免这些问题,开发时应谨慎处理闭包,避免不必要的嵌套,并及时清理不再使用的变量和监听器。
509 16
当面试官再问我JS闭包时,我能答出来的都在这里了。
|
12月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
11440 23
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
367 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
288 3
springboot解决js前端跨域问题,javascript跨域问题解决
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
705 5
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
414 4
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
595 1
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
1584 2
|
设计模式 前端开发 JavaScript
揭秘!前端大牛们如何巧妙利用JavaScript,打造智能交互体验!
【10月更文挑战第30天】前端开发领域充满了无限可能与创意,JavaScript作为核心语言,凭借强大的功能和灵活性,成为打造智能交互体验的重要工具。本文介绍前端大牛如何利用JavaScript实现平滑滚动、复杂动画、实时数据更新和智能表单验证等效果,展示了JavaScript的多样性和强大能力。
374 4

热门文章

最新文章