前端面试题整理

js相关

  • 闭包?内存泄露?
    :通常都是A函数return一个B函数,B函数使用了A函数内声明的变量;闭包可以让外部作用域访问局部作用域的变量;闭包可以用来封装变量,使其不受外界的干扰,同时又可以通过返回的函数来访问和操作这些变量
    内存泄露: JavaScript中的内存泄露指的是分配给程序的内存没有被正确释放,导致该内存不能被操作系统重新分配给其他进程使用。这通常发生在以下情况:
    意外的全局变量:未使用var, let, 或 const声明的变量会自动成为全局对象的属性,而全局对象不会在脚本结束时被垃圾收集器回收。
    内存泄露:函数内部定义了另一个函数,而该内部函数引用了外部函数的变量,导致外部函数的内存无法释放。
    DOM元素被遗漏:如果一个DOM元素被JavaScript变量所引用,而该变量又被其他对象所引用,那么这个DOM元素也不能被垃圾收集器回收。
    解决内存泄露的策略:
    避免创建全局变量。
    使用let和const声明变量。
    在不需要时手动解除不再使用的DOM元素的事件监听器和其他引用。
    避免闭包造成的内存泄露,如果不再需要数据,则设置闭包中的变量为null。
    使用开发者工具检查和分析内存使用情况,如Chrome的开发者工具。
    总结:通过避免不必要的全局变量、使用let和const、移除事件监听器和解除闭包引用,可以有效地预防JavaScript中的内存泄露问题。
  • 原型和原型链
    :类显式原型的prototype等于其创建的实例的隐式原型__proto__;查找对象实例的方法和属性时,先在自身找,找不到则沿着__proto__向上查找,我们把__proto__形成的链条关系称原型链
    https://blog.csdn.net/m0_55734030/article/details/127971640
  • let const var 区别?什么是作用域?
    :let 和 const 有暂时性死区,不能重复声明,拥有块级作用域;const 不能重复赋值,但是引用对象内的内容可以修改,因为const保存的对象的引用指针,并未修改;var 声明的全局作用域的值,挂在window上的
  • this指向相关的问题?call和apply和bind有什么区别?
    :一般情况下this指向对象的调用者,如没有调用者指向window对象,箭头函数里面没有自己的this 他只会从自己的作用域链上一层继承this;在function的原型上有三个方法 call apply bind,所有函数都是Function的实例,所以所有的函数都可以调用这三个方法,而这三个方法都是用来改变this指向的,call和apply参数不同,call 的入参是多个参数逗号分隔,apply入参是数组,bind 返回一个改变了this指向的新函数
  • 隐式类型转换
    :对于引用类型,先调用valueOf(),如果能转成数字,则进行比较。不能转成数字就调用toString()方法转成字符串。
    https://blog.csdn.net/owo_ovo/article/details/132090609
  • 堆和栈的区别?基础数据类型和引用数据类型的区别?和深拷贝的实现方法?

    堆(heap):是堆内存的简称,堆是动态分配内存,内存大小不固定,也不会自动释放,堆数据结构是一种无序的树状结构,同时它还满足key-value键值对的存储方式;我们只用知道key名,就能通过key查找到对应的value。比较经典的就是书架存书的例子,我们知道书名,就可以找到对应的书籍。
    栈(stack):是栈内存的简称,栈是自动分配相对固定大小的内存空间,并由系统自动释放,栈数据结构遵循FILO(first in last out)先进后出的原则,较为经典的就是乒乓球盒结构,先放进去的乒乓球只能最后取出来。
    基本数据类型存放的是一个值,而引用类型存放的是一个(对象)地址。
    如果对对象直接赋值给另一个对象,其实赋值的是一个对象地址,新复制出来的指向同一个堆地址。可以用JSON.stringify和 JSON.parse,装换成字符串在转会对象,但有局限性,例如对象内有时间戳等;也可以用for in 遍历对象,判断是不是对象类型,如果是基础数据类型直接复制,引用类型就递归调用函数;也可以用第三方库,lodash的cloneDeep
  • 跨域的解决方法
  • jsonp;服务器白名单;服务器代理(跨域是浏览器所产生的,所有用服务器调用服务器是没有问题的)
  • for in 和 for of 的区别
    -:for in 是循环对象和数组的;for of 是循环 可迭代对象的 (数组是可迭代对象,所以可以循环数组)
    for…in 语句用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。
    for in得到对对象的key或数组,字符串的下标
    for of和forEach一样,是直接得到值
    for of不能用于对象
  • 什么是可迭代对象
    string Array Map set 和 nodeList 都是可迭代对象
    https://blog.csdn.net/weixin_45705239/article/details/137246433
  • 浏览器缓存
    : 协商缓存,和强缓存
  • 数组有哪些api
    :forEach find reduce map includes indexOf splice slice join reverse sort every some
    https://juejin.cn/post/6907109642917117965
  • 什么是事件循环
  • https://blog.csdn.net/Cipher_Y/article/details/131729325
  • es6 有哪些语法? 链操作法的使用
    :变量声明:ES6引入了let和const关键字来声明变量。let用于声明变量,其作用域限制在块级别,即在一对大括号{}内。const则用于声明常量,即声明后的值不可修改,且声明时必须进行初始化赋值。
    解构赋值:ES6允许从数组或对象中提取值,然后按照对应位置,对变量进行赋值,这被称为解构赋值。
    箭头函数:ES6新增了箭头函数,它使用箭头=>来定义函数,可以省略“function”关键字,并且如果函数体中只有一句代码,且代码的执行结果就是函数的返回值,那么大括号可以省略。箭头函数不绑定this,this在箭头函数中指向的是函数定义位置的上下文this。
    模板字符串:ES6新增了模板字符串,使用反引号 来定义,模板字符串中可以解析变量,也可以换行,还可以在模板字符串中调用函数。
    扩展运算符:扩展运算符…可以将一个数组或者对象转为用逗号分隔的参数序列,常用于合并数组或将类数组或可遍历对象转换为真正的数组。
    新增数据类型:ES6引入了新的数据类型,如Symbol,表示独一无二的值;Map,类似于对象,但其键可以是任何数据类型;Set,类似于数组,但成员的值都是唯一的,没有重复的值。
    此外,ES6还包括了默认参数、剩余参数、展开语法(…)、增强的对象字面量、for…of循环等语法特性,以及Proxy、Promise、Intl API等新的API和功能。
let a = {}
console.log(a?.b?.c)
  • import和require 导入的区别

    1, require是commonJS规范的模块化语法,import是es6规范的模块化语法
    2,require是运行是加载(可以在js中的任意地方使用),import是编译时加载(只能放到文件的最开头)
    3,require通过module.exports导出的是exports对象,import通过export导出是指定输出的代码;
    4, require导入的值被修改时,源对象不会被改变,相当于深拷贝;import导入的对象值被改变时,源对象也会被改变,相当于浅拷贝
  • Promise和async/await的区别是
  • https://blog.csdn.net/Liw_J/article/details/137340305
  • 什么是防抖和节流?使用场景有哪些?
    https://blog.csdn.net/weixin_42554191/article/details/107217271
  • break return 和 continue 在 for 和 forEach 中 有什么区别
    https://blog.csdn.net/qq_44741577/article/details/135932427
  • 数组去重的方法
    1 双重for循环去重。这种方法通过双重循环遍历数组,如果发现重复元素,则删除或跳过。
    2 利用indexOf()方法去重。通过indexOf()方法查找元素在数组中首次出现的位置,如果该位置与当前位置相同,则说明没有重复元素。
    3 利用filter()方法去重。filter()方法用于过滤数组,如果数组中没有重复元素,则将其添加到新数组中。
    4 使用Set数据结构去重。Set是一种数据结构,其成员值唯一,可以利用它来去除数组中的重复元素。
    5 使用includes()方法去重。includes()方法用于检查数组是否包含某个值,如果不包含,则添加到新数组中。
    6 使用sort()方法去重。首先对数组进行排序,然后逐个检查相邻元素是否相同,只保留首次出现的元素。
    7 使用对象属性去重。利用对象属性名唯一的特点,通过遍历数组并将元素作为对象属性来去除重复元素。
  • 网络传输tcp和其他协议
    https://baijiahao.baidu.com/s?id=1793984712640873484&wfr=spider&for=pc
  • 怎么判断数据类型
    https://www.jb51.net/article/195391.htm

框架相关(vue)

document.documentElement.style.setProperty('--primary-color', '#007bff')

https://blog.csdn.net/qq_32594913/article/details/131051885

浏览器相关

打包工具相关

性能优化相关

  • cdn,dns,打包方面,缓存方面,代码层面,网络层面,安全相关

样式相关

  • flex 和 grid的区别?实现元素居中的方法
  • 媒体查询,动画,过渡

第三方库相关

  • lodash一些常见的方法原理
  • echart 使用
  • 地图使用

网络相关

算法相关

  • 排序算法有哪些
  • 动态规划排序

git命令

其他博客链接
关于数据库,微前端,vue的作者理解
关于vite,webpack的作者理解
一些常见的手写面试题

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值