JavaScript面试题

1.数组去重

1.es6 set去重 使用new set(arr)
2.嵌套使用for循环去重 需要修正数组下标
3.使用indexOf和lastindexof去重,新建数组,查询新数组中是否包含原数组不包含就放入
区别一个从前找一个从后找
4.使用sort排序后相邻数组元素去重,因为原来的数组元素是乱序的,排序后可以相邻比较
每次不同放后一项 也需要新建一个数组
5.使用es6 includes方法去重,新建数组 查询新数组是否有原数组的值没有加入
6.使用过滤器方法 indexof返回下标 通过判断下标和查询下标是否一致来判断是否重复
8.使用foreach + indexof()去重,就类似于fliter
7.使用reduce+includes 
9.使用hasOwnProperty判断是否存在对象属性,使用filter过滤

2.Dom事件流顺序,事件委托

事件流描述从页面中接收事件的顺序

先捕获后冒泡,默认冒泡
事件写在父级元素上,使用e.target选中触发事件的元素

阻止默认行为 event.preventDefault()

阻止事件冒泡 event.stopPropagetion()

3.原型链

js通过原型链模拟实现面向对象,通过实例化构造函数给每个对象挂载自己的专属属性
通过给类的prototype上附方法来给所有实例化的对象所共有的方法,实例化不再赋链上的方法

4.防抖节流

防抖只在最后一次事件后执行触发函数
节流只在规定时间内执行一次
都是利用一个超时定时器,将多操作合并
防抖是取消之前相同操作的计时器,只执行最后操作的计时器
节流是一定时间内触发一次事件,减少多次触发

5.ES5+ES6继承

1.原型链继承:父类的实例作为子类的原型

让子类的原型对象指向父类实例  Child.prototype = new Parent()
子类实例找不到对应的属性和方法时,就会往它的原型对象-父类实例上找
Child.prototype.constructor = Child
2.构造函数继承:复用父类实例属性给子类

子类的构造函数中执行父类的构造函数,并为其绑定子类的this
Parent.call(this,'')
3.原型链+构造函数组合继承
构造函数继承实例属性,原型链继承原型属性和方法
4.寄生继承
创建一个实现继承的函数,该函数内部以某种形式增强对象后返回
5.寄生式组合继承
将执向父类实例改为指向父类原型,减去一次构造函数的执行
6.es6类+寄生式组合继承
extends

6.Js作用域

作用域就是变量的可访问性和可见性
全局 函数局部作用域 es6块级作用域

7.操作字符串方法

1.charAt(index) 返回指定位置字符
2.charCodeAt(index) 返回指定位置字符的unicode编码
3.a.concat(b) 字符串拼接
4.indexOf('str') 检索字符串大小写敏感
5.match(/正则匹配/) 检索字符串返回具体值
6.replace(/正则匹配/) 字符匹配替换
7.search(/正则匹配/) 检索字符串中指定的子字符串
8.slice(start,end) 字符串片段截取
9.splie(“分割符”)  字符串分割
10.toLocaleLowerCase()&&toLocaleUpperCase() 字符串大小写转换
11.substr(start,length) 提取指定长度字符串
12.substring(start,stop) 提取索引之间的字符
13.for of
14.repeat 字符串重复执行n次
15.padStart(length,‘str’) padEnd() 补全字符串
16.${}模板字符串

8.闭包

js中内层函数可以访问外层函数的变量,外层函数不能操作内层函数的变量的特性
一个js文件就相当于一个闭包,导出引入
闭包可以保护私有变量,形成局部作用域,防止污染全局,可以使用回调来操作函数内部
js变量指向没有用处后就会销毁,闭包内的变量不易被内存回收机制回收,延长变量生命周期
闭包容易造成内存泄漏,且需要手动清除,变量赋值null

9.深浅拷贝

深浅拷贝拷贝的层级不同,深拷贝后对拷贝数据每一层级的改动都不会影响原数据
浅拷贝只有第一层不会影响,深层还会影响
实现深拷贝:使用递归实现,使用lodash库
使用Json的stringify和parse 1-会过滤函数和undefinded 2-会丢到指向constructor
使用jquery $.extend({},targetObject)  深度合并$.extend({},targetObject1,targetObject2)

10.this指向

call(指向,‘参数’)
apply(指向,‘数组参数’)
bind(指向)(参数) bind改变this指向会自调用返回新函数,再调用传参
ES6箭头函数,this指向外部作用域

new实例化对象

11.数据存储

window属性
本地持久化 localStorage 5m  除非手动清除
会话存储 sessionStorage 关闭页签浏览器清除
document属性
cookie 请求发送存储 有过期时间 数据在同源http请求中携带   cookie在浏览器和服务器间来回传递
session 服务器存储

12.var let const 区别

var 存在变量提升  变量覆盖  没有块级作用域 允许重复声明以最后一次为准

let 有块级作用域  不存在变量提升和变量覆盖  相同作用域下不允许重复声明

const  定义常量  声明后必须赋值 定义的基本数据类型值不能被修改 不存在变量提升和覆盖

13.get,post请求区别

get请求通常从服务器端获取数据 post请求则向服务器端发送数据

post请求要比get请求更安全,post请求数据不显示在地址栏中,而是封装在请求体中

get请求提交数据量有限制,post请求没有

在网络环境较差的情况下,两次包的TCP在验证数据包完整性上 post发送两次,get只发送一次

14.async和await的区别

async用来定义异步函数,打印函数名可以得到一个promise对象

async内部实现,有返回值,成功.then()返回promise.resolve()  失败.catch()捕获promise.reject()

await后跟容易表达式,通常情况下跟一个promise表达式

await等待promise对象执行完成,等到获得了promise对象的resolve()值后,向后执行

15.Js数据类型

基本数据类型:Number,String,Null,Undefinded,Booleam,Bigint,Symbol

复杂数据类型:Object

函数,数组,日期,对象同属于Object数据类型

16.map,forEach区别

forEach(item,index,array):遍历循环 不返回新数组

map(callback): 原数组映射  有返回值:数组   不修改原数组

17.箭头函数/普通函数

箭头函数没有this,需要查找作用域链来确定this的指向

箭头函数继承来的this指向不会被改变,不能通过call,bind,apply来改变this指向

箭头函数不可以作为构造函数,不能使用new关键字调用

箭头函数中没有arguments对象,可以使用Rest参数代替

箭头函数没有原型prototype,不具有super

18.es6特性

let const

箭头函数

变量解构

函数携带默认参数

对象超类super

symbol

set和map的数据结构

promise对象

async await

class

19.Promise

const myPromise = new Promise((resolve,reject) => {

异步操作  resolve(value) reject(reason)

})

promise是异步编程的一种解决方案,promise的状态一经确定不会再变

promise状态:pending(进行中) fulfilled(已成功)rejected(已失败)

promise.all()可以将多个Promise实例包装为一个新的promise实例,成功返回一个结果数组

失败返回最先reject失败状态的值

promise.all()获得成功结果的数组里面的数据顺序和promise.all接收到的数组顺序是一致的

20.for...in和for...of区别

for...in通常用于遍历数组和对象的属性

for...of类似于forEach遍历数组和对象的每一项

21.事件循环(Event Loop)

JavaScript是一种单线程的编程语言,同一时间只能做一件事,所有任务都需要排队完成

浏览器事件循环分为同步和异步任务

同步任务:在主线程上排队执行的任务,形成函数调用栈

异步任务:异步任务分为宏任务和微任务,放到任务队列

宏任务:包括script整体代码,定时器任务,I/O,UI交互事件

微任务:new promise().then(回调), MutationObserver,process.nextTick

同时存在 nextTick有比promise更高的执行优先级

执行优先顺序:同步-->异步微任务-->异步宏任务

22.设计模式+原型https://blog.csdn.net/qq_53402777/article/details/134154759?spm=1001.2014.3001.5501
23.Null和undefined的区别

undefined和null的区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值