JS面试题
- 创建对象方式的区别
- = =和= = =
- let const var的区别
- this指向
- 箭头函数和匿名函数的区别
- 执行上下文
- 闭包
- 闭包的变量存在堆还是栈
- 自执行函数?用于什么场景?好处?
- JavaScript提供了哪几种“异步模式”?
- Promise的返回状态
- 回调函数?
- 原生AJAX
- readystate 0~4
- ajax中 get 和 post 有什么区别?
- 事件流?事件捕获?事件冒泡?
- 事件委托
- 防抖
- 节流
- 原型prototype和__proto__
- commonJS和ES6模块化
- instanceof原理
- 判断是否是数组
- ES5继承
- ES6继承
- async和await
- 生成器函数
- 前端捕获异常
- 0.1 + 0.2 !== 0.3
- JS设计模式
- 浏览器事件循环:宏任务和微任务
- Node事件循环
- nodejs创建多进程
创建对象方式的区别
1、字面量
2、new:可以传参(数组初始化确定长度)
3、Object.create():参数作为新对象的原型
= =和= = =
let const var的区别
this指向
1、默认指向全局(独立调用,严格和非严格模式下有区别)
2、隐式绑定到调用者
3、显式绑定(call、apply、bind)
4、new(指向实例)
优先级4>3>2>1
箭头函数和匿名函数的区别
普通函数的this在实际调用时绑定到调用者上;而箭头函数内没有this,会取用最近层作用域的this。
执行上下文
是一个对象,对函数作用域或全局作用域内的存在变量提升等情况进行一个预处理。
闭包
1.闭包是什么?
一个函数内嵌套函数(外层函数的返回值是内层函数),并在另一个作用域调用内层函数。
在JS中,变量定义在函数中,函数执行后作用域就会被清理、内存也被收回。闭包是建立在一个函数内部的子函数,由于其可访问上级作用域,并且在其他地方被调用,即使上级函数执行完,作用域也不会随之销毁,这时的子函数,就起到延长上级函数内变量生命周期的作用。
2.用处?
(1) 避免了变量污染,读取函数内变量(不想创建全局变量,那么就在外层函数中内层函数外创建变量,这样内层函数就可以像使用全局变量一样使用定义在函数中的变量)
(2) 另一个就是让这些变量的值始终保存在内存中。
闭包的变量存在堆还是栈
堆。
原因:栈存储简单数据类型,堆存储复杂数据类型,所以栈中的数据一般不存在引用情况(浅拷贝),所以一般都会在当前执行环境结束后被回收;而堆中数据会存在引用情况,不会被马上释放,会在确定无引用情况下才会被回收,而闭包中的变量因为其内部函数引用,不能马上释放,而存放在堆中
自执行函数?用于什么场景?好处?
自执行函数:1、声明一个匿名函数2、马上调用这个匿名函数。
作用:由于ES5只有函数作用域,所以不想使用全局变量就只能创建一个函数用来当作独立的作用域,避免变量污染,又可以实现临时调用一次的效果。
场景:封装功能,一般用于框架、插件等场景
JavaScript提供了哪几种“异步模式”?
1、回调函数
2、事件监听
3、Promise、async/await
4、发布订阅模式
Promise的返回状态
1.返回值——成功
2.抛出异常——失败
3.返回一个promise对象,根据返回对象的成功或失败来决定
(即使调用resolve()也不能确定一定调用成功的回调,若resolve的参数是一个promise,那么回调将由作为参数的promise的状态来决定;而调用reject()则必会调用失败的回调)
回调函数?
回调函数:通过函数指针调用的函数。(把函数指针作为参数传递给另一个函数用于在事件发生时调用该函数进行响应)
原生AJAX
1、创建XMLHttpRequest对象
2、为onreadystatechange绑定回调函数
3、使用open(请求方式, 服务器地址, 异步或同步方式)方法设置参数
4、使用send()方法发送请求
5、使用responseText接受返回数据
readystate 0~4
0:未初始化状态:此时,已经创建了一个XMLHttpRequest对象
1: 准备发送状态:此时,已经调用了XMLHttpRequest对象的open方法,并且XMLHttpRequest对象已经准备好将一个请求发送到服务器端
2:已经发送状态:此时,已经通过send方法把一个请求发送到服务器端,但是还没有收到一个响应
3:正在接收状态:此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收到
4:完成响应状态:此时,已经完成了HTTP响应的接收
ajax中 get 和 post 有什么区别?
1.get通过网址问号后拼接字符串传递。post通过HTTP包体传递。
2.get传输量有限制,post无限制。
3.get的安全性差。
事件流?事件捕获?事件冒泡?
事件流:从页面中接收事件的顺序。一个事件产生时的传播过程,就是事件流。
1.早期IE中的事件流叫事件冒泡,由里及外;
2.事件捕获是由外及里;(捕获比冒泡更快)
3.当一个组合元素中存在不同点击事件时,比如点击头像和点击主体对应的响应不同,那么就可以在点击头像的处理函数中,阻止事件冒泡,否则点击头像时两者的事件都会触发。
事件委托
简介:不在事件的发生地(直接dom)上设置监听函数,而是在其父元素上设置监听函数
举例:最经典的就是ul和li标签的事件监听,比如我们在添加事件时候,采用事件委托机制,不会在li标签上直接添加,而是在ul父元素上添加。
好处:比较合适动态元素的绑定,新添加的子元素也会有监听函数,也可以有事件触发机制。
防抖
定义:同一事件在一段时间内大量触发,控制其只触发最后一次
function debounce(fn,delay){
let timer = null //借助闭包,避免全局污染
return function(args) {
if(timer){
clearTimeout(timer) //如果在之前已经触发滚动事件设置过setTimeout了那么就清除该事件,重新设置定时器
}
timer = setTimeout(fn