2025年前端面试准备js篇
1.js的基本数据类型有哪些
undefined,null,bo0lean,number,string,object,Symbol,bigInt
分为原始类型和引用类型
原始类型:undefined,null,bo0lean,number,string,Symbol,bigInt
引用类型:(对象,数组和函数)
2.数据类型检测的方式
typeof:数组,对象,null 都会判断返回Object,其他可以正常返回。
instanceof:可以正常的判断对象的类型是判断在其原型链中能否找到该类型的原型,
只能正确判断引用类型数据。
constructor有两个作用,一是判断数据的类型,二是对象实例通过constrcutor 对象访问它的构造函数
3.js中的this
this 是执行上下文的一个属性,指向最后一个调用这个方法的对象。
this的指向判断
函数调用式:一个函数不是一个对象的属性时,直接作为函数来调用时,this 指向全局对象。
方法调用式:一个函数作为一个对象来调用的的时,this 指向这个对象。
构造器调用时:一个函数用new调用时,函数执行前会创建一个对象,this 指向这个新创建的对象。
applay,call和bind 调用模式:可以显示的指定调用函数的this指向,
applay:接收两个参数,第一个是this 绑定的对象,一个是参数数组。
call:第一个是参数是this 绑定的对象,其余的参数都是要传入函数的,参数必须逐个列举出来
bind 方法通过传入一个对象,返回this 绑定对象传入的新函数。
箭头函数与普通函数的区别
箭头函数比普通函数更加简洁,如果不需要返回值 可以语句前面加一个void
let fn = () => void desoNotReturn();
箭头函数没有this,它会在自己作用域的上一层继承this。继承来的this 指向永远不会改变,
不能当做构造函数使用,箭头函数没有protoType,不能作用Generator函数,不能使用yeild关键字
4.let const var 的区别
块级作用域由{ }包括,let和const 具有块级作用域,var 不存在块级作用域。
var 存在变量提升,let 和 const 不存在变量提升,变量只能在声明之后使用。
浏览器的全局对象是window, Node 的全局对象是global,var 声明的变量为全局变量,
并且会为 变量添加全局对象的属性,但是let 和 const 不会。
重复声明: var 声明变量可以重复声明 后面的会覆盖前面的,const和let 不存在。
初始值设置: 变量声明的时候 var 和let 可以不用设置初始值,const 必须设置初始值。
5.数组的原生方法
数组和字符串的转换方法:toString(),toLocalString(),join()。
数组尾部的操作方法: pop()和 push()
数组首部操作的方法: shift() unshift()
数组重新排序的方法: reverse() 和 sort()
数组的链接方法 :concat() 返回的是拼接好的数组,不影响远数组。
数组截取办法: slice() 用于截取数组中的一部分返回,不影响元素组。
数组插入方法: splice()
数组查找特定项的索引方法:indexOf() 和lastIndexOf()
数组的迭代方法: every(),some(),filter(),map() 和forEach()
数组的归并方法: reduce() 和 reduceRight() 方法。
6.for in 和for of 的区别
for of 遍历获取的是对象的键值,for in 获取的是对象的建名
for in 会遍历对象的整个原形链 返回数组中所有可枚举的属性,for of 只遍历当前对象不会遍历原型链只返回数组的下标。
7.数组的遍历方法
方法
|
是否改变原数组
|
特点
|
forEach()
|
否
|
数组方法,值是基本类型,改变不了,如果是引用类型分两种情况:没有修改形参元素的地址只是修改形参元素内部的某些属性,会改变数组,直接修改整个元素的对象的时候无法改变整个数组。没有返回值。
|
map()
|
否
|
数组方法,不改变原数组,没有返回值,可链式调用
|
filter
|
否
|
数组方法,过滤数组,返回包含符合条件的数组,可链式调用
|
for of
|
否
|
返回的是数组的元素,对象的属性,不能遍历普通对象的obj对象,将异步循环变成同步循环。
|
every()和some()
|
否
|
数组方法,some() 只要有一个true 就返回true,every()
只要有一个是false 就返回false
|
find()和findIndex
|
否
|
数组方法,find() 返回的是第一个符合条件的数组 findIndex()返回的是第一个返回条件的值的索引值。
|
reduce() 和 reduceRight()
|
否
|
数组方法,reduce()对数组正序操作;reduceRight对数组逆序操作。
|
8.原型和原型链
对原型和原型链的理解
每一个构造函数内部都有一个prototype 属性,属性值是一个对象包含了所有实例共享的属性和方法,新建
一个对象后对象内部会有一个指针 指向构造函数的protoType 属性的值,这个指针被称为对象的原型。
当访问一个对象的属性的时候,对象内部不存在这个属性,那会就会去它的原型对象里找这个属性
这个原型对象又有自己的原型,这样一直找下去,也就是原型链。
9.执行上下文,作用域(链),闭包
闭包:闭包是指有权访问另一个函数作用域中变量的函数
全局作用域:最外层函数和最外层函数外面定义的变量拥有全局作用域,未定义直接赋值的变量自定声明为全局变量。
所有window 对象的属性拥有全局作用域
函数作用域:函数作用域声明在函数内部的变量,一般只有固定的代码片段可以访问到,作用域是分层的,内层作用域可以访问外层作用域。
块级作用域:let 和const 指令可以声明块级作用域,let 和const 声明的变量不会有变量提升,也不可以重复声明。
作用域链:在当前作用域中查找所需变量,但是该作用域中没有这个变量,依次像上级作用域中查找,直到访问到
window 对象就被终止,这一层层的关系就是作用域链。
执行上下文:在执行js代码之前,需要先解析代码,在解析的时候会先创建一个全局执行上下文环境,先把代码中将执行的变量,函数声明都拿出来,变量先赋值还给undefined,函数声明好可使用,这一步执行完了才开始正式的执行程序。
10.异步编程的实现方式
回调函数: 多个回调函数嵌套的时候会造成回调地域,回调函数间的代码耦合度太高,不利于代码维护。
Promise:可以将嵌套的回调函数作为链式调用,有时候会造成多个then 的链式调用,可能会造成代码的语义不够明确。
generator:在函数的执行过程中,可以将函数的执行权转移出去,在函数外部还可以将函数的执行权转移回来。
async 函数:是generator 和promise 实现的一个自动执行的语法糖,当函数内部执行到一个await 语句的时候,如果语句返回
一个promise 对象,那面函数将会等待,promise 对象的状态变为 resolve 在继续向下执行。因此可以将逻辑转换为同步的顺序来写,并且这个函数可以自执行。
await:用于等待一个Promise 完成,并返回结果。
11.Promise.all 和Promise.race 的区别的使用场景
Promise.all 可将多个Promise 实例包装成一个新的Promise 实例,成功和失败返回的值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先reject 失败状态的值。Promise.all 传入的是一个数组,返回的也是一个数组。
Promise.race:Promise.race([P1,P2,P3])里面那个结果获取的快,就返回哪个结果,不管结果本身是成功还是失败。
12.浏览器的垃圾回收机制
JavaScript 具有自动垃圾回收机制,会定期对那些不在使用的变量,对象占用的内存进行释放,找不到再使用的变量就会被释放掉。
内存中有两种形式的变量,一种事全局变量,一种是局部变量,全局变量的生命周期会持续到页面卸载,局部变量会在函数执行结束,不在被使用的时候。
垃圾回收的方法有两种:标记清除,引用计数
减少垃圾回收:对数组进行优化,对Object 进行优化 对函数进行优化
13.有哪些情况会导致内存泄漏
意外的全局变量,被遗忘的计时器或回调函数,脱离 DOM 的引用 闭包。
14.ES6 有哪些新特性
箭头函数,解构赋值,模版字符串,promise,symbol,let,const,import导入,export 导出,
for of 循环,Map和Set 引入两种新的数据结构,分别用于存储键值对和唯一值,Proxy允许在
对象和函数调用等操作前后提那家自定义的行为,引入了class。
15.函数柯理化
函数柯理化是一种将使用多个参数的函数转化成 使用一个或多个参数的函数技术,柯理化的主要思想是将函数的参数分解成多个函数调用,每一个函数只接收一个参数,提高灵活性和复用性。
16.什么是事件循环?调用堆栈和任务队列之间有什么区别?
事件循环是一个单线程循环,用于监视调用堆栈是否有工作即将在任务队列中完成,如果调用堆栈为空并且任务队列中有回调函数,将回调函数出队并推送到调用堆栈中执行。
17.js 防抖和节流
防抖:事件被触发后等待一段时间,如果在这段时间内又被触发了,则需要重新计算延迟时间,只有最后一次事件会在间隔结束后执行。例如:搜索框的输入搜索功能
节流:在指定的时间内无论触发多少次,只有第一次会立即执行,之后如果事件在事件间隔内再次触发,则这些触发都会被忽略,直到下一个时间间隔开始。例如:滚动事件的监听。
18.就是设计模式有哪些
设计模式分为三大类
创建模式:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式
结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,亨源模式。
行为模式:策略模式,模版方式模式,观察者模式,发布订阅模式,迭代器模式,责任链模式,命令模式备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。