一 : 原型和原型链
- 所有的函数都有显式原型,所有的对象都有隐式原型
- 对象的隐式原型等于它的构造函数的显式原型
- 原型链: 就是查找对象的成员时的一条线路。显式原型的作用是用来共享方法的.显式原型也是一个对象,他也有 隐式原型,显式原型的构造函数是,所以就有一条线路。最后找到Object,最终是找到null就停止
二 : this的指向问题
- 普通函数的this指向window
- 箭头函数没有this,它的this指向取决于外部环境
- 事件中的this指向它的调用者
- 定时器的this指向window
- 原型对象和构造函数的this都指向构造函数new出来的实例对象
- vue中this指向vue实例
三 : 深拷贝和浅拷贝
- 浅拷贝 : 只拷贝简单数据类型的值 只拷贝一层 浅拷贝常用方法 : 使用Object.assign()方法 , 可以使用展开运算符
- 深拷贝 : 拷贝复杂的数据类型 拷贝的是值和地址,拷贝多层 深拷贝常用方法 : 使用JSON.parse()和JSON.stringify(),使用Lodash工具库的cloneDeep()方法,手写递归函数实现深拷贝
四 : 节流和防抖
- 节流 : 在一定的时间内重复执行某段代码,只执行一次
- 防抖 : 在一定的时间内重复执行某段代码,只执行最后一次
五 : new的执行过程
- 创建一个空对象
- 将新对象的隐式原型指向构造函数的显示原型,建立对象和原型的对应关系
- 将构造函数的this指向新创建的对象,并传入参数
- 返回这个新对象
六 : call-apply-bind的区别与联系
由来 : 因为js里面,this是函数调用的时候,动态产生的一个变量,值会发生变化,所以js提供了 三个方法,可以来修改this的指向,分别是call、apply、bind
- call bind的参数都是逗号分隔;而apply的参数 是数组
- call 常用在判断数据类型,以及伪数组转换真数组 Object.prototype.toString.call(xxx)
- apply 常用在 参数是数组的一些情况,如Math.max 最大最小值等
- bind 常用在定时器的回调函数上,vue里面需要手动指定this的方法上
七 : 常见HTTP状态码
- 2xx 200一般表示请求成功 204 表示服务器成功处理了请求,但是没有返回内容,常见的非简单请求类型option,就只是一个预检请求
- 3xx 301资源永久重定向 302 资源临时重定向 304资源没有改变,使用的是缓存
- 4xx 401 身份认证失败,账号或密码输入错误 403 账号没有权限 404 资源访问不到
- 5xx 500 服务器内部错误 502 网关或代理错误,没有响应 504 网关或代理超时
八 : get请求和post请求的区别
- .Get请求的数据、参数会显示在地址栏或者ajax请求的url上面。但是POST不会,Post请求的参数存放到了请求实体中,而Get没有请求实体
- 数据传输Post有优势,Get方式请求的数据不能超过2KB,而Post没有上限,但是这个限制不是http协议的限制,而是浏览器和服务器的限制
- 浏览器缓存Get也有优势,而Post没有。一般数据查询使用get,数据修改使用Post,表单提交全部使用Post提交
- 安全性上:POST比GET安全,因为数据在地址栏不可见;但是从传输的角度上来说,他们都是不安全的,因为http在网上都是明文传输,可以被截获,只有使用https才能加密安全
九 : 事件循环
- 首先按js是一种单线程异步非阻塞的语言,单线程意味着,所有任务都需要排队,前一个任务结束,才会执行后一个任务
- 所有同步任务都在主线程上执行,形成一个 “执行栈”
- 主线程之外,存在一个 “任务队列”(task queue),在走主流程的时候, 如果碰到异步任务,那么就在 “任务队列” 中放置这个异步任务
- js里面的异步任务又分为宏任务和微任务,执行过程中同步代码直接执行,宏任务进入宏任务队列,微任务进入微任务队列,当前宏任务执行完出队,检查微任务列表,有则依次执行,直到全部执行完,执行完本轮的宏任务,再执行同步任务,微任务,依此循环,直到宏任务和微任务队列都为空
十 : 声明提升
声明提升有变量声明提升和函数声明提升两种
- 变量声明是之前在es6之前使用var声明变量的时候,才会有这种情况。在"编译阶段"将变量的声明提升,到当前作用域的顶部,变量赋值的位置不动
- 函数声明提升就是在编译阶段将函数声明提升到当前作用域最顶部
- 如果变量声明提升和函数声明提升同时存在,函数声明提升会优先于变量声明提升