1.延迟加载js方式有哪些:
1.延迟加载:async、defer
defer:等html全部解析完成,才会执行js代码,顺次执行js脚本的。
async:async是和html解析同步的(一起的),不是顺次执行js脚本(谁先加载完谁先执行)。
2.动态创建dom方式
3.使用jQuery的getScript()方法
4.使用setTimeout延迟方法的加载时间
5.让js最后加载
2.js数据类型
基本类型:string、number、boolean、undefined、unll、symbol、bigint
引用类型:object(array function)
3.js隐式转换
console.log(true+1); // 2
console.log('name'+true); // 字符串和任何相加都会变成字符串 'nametrue'
console.log(undefined + 1); // NaN ,NaN是一个数值类型,但不是一个具体的数字
console.log(typeof(NaN)); //number类型
console.log(typeof(undefined)) ; //undefined
4.null和undefined 的区别
1.作者在设计js的时候先设计的null,表示‘无’的值(最初设计js的时候借鉴了java的语言)
2.unll会被隐式转换成0.很不容易发现错误
3.先有null后有undefined,出来undefined式为了填补之前的坑。
具体区别:javascript的最初版本是这样区分的:null是一个表示‘无’的对象(空指针),转为数值时为0;undefined,转为数值时为NaN。
5.==和===有什么不同?
==:比较的是值,用valueOf做隐式转换
===:除了比较值,还比较类型
console.log( 1=='1' ) ; //true
console.log(true == 1); //true
console.log(null == undefined); //true
console.log([1,2] == '1,2'); // true
6.js微任务和宏任务
1.js 是单线程语言,同一时间只能做一件事
2.js代码执行流程:先执行同步==》事件循环
同步任务都执行完了,才会执行事件循环的内容
进入事件循环:请求、定时器、事件
3.事件循环【微任务、宏任务】
微任务:promise.then
宏任务:setTimeout ..
要执行宏任务的前提是清空了所有的微任务
流程:同步==》事件循环【微任务和宏任务】==》微任务==》宏任务=》微任务。。
7.js作用域考题
1.除了函数外,js是没有块级作用域的
2.作用域链:内部可以访问外部的变量,但是外部不能访问内部的变量
8.new 操作符具体做了什么
1.创建了一个空的对象
2.将空对象的原形,指向于构造函数的原形
3.将空对象作为构造函数的上下文(改变this指向)
4.对构造函数有返回值的处理判断
function Fun(age) { this.age = age; this.name = name; } function create(fn, ...args) { // 1.创建了一个空对象 var obj = {}; // 2.将空对象的原形,指向于构造函数的原形 Object.setPrototypeOf(obj, fn.prototype); // 3.将空对象作为构造函数的上下文(改变this指向) var result = fn.apply(obj, args); // 4.对构造函数有返回值的处理判断 return result instanceof Object ? result : obj; } console.log(create(Fun, 18, '张三'))
9.闭包
1.闭包是什么
闭包是一个函数加上到创建函数的作用域的链接,闭包“关闭了”函数的自由变量
2.闭包可以解决什么问题【闭包的优点】
2.1内部函数可以访问到外部函数的局部变量
3.闭包的缺点
3.1变量会驻留再内存中,造成内存损耗问题
解决:把闭包函数清空设置为null
3.2内存泄漏【ie浏览器】
10.原形链
1.原形可以解决什么问题
对象共享属性和共享方法
2.谁有原形
函数拥有:prototype
对象拥有:__proto__
3.对象查找属性或者方法顺序
先在对象本身查找-->到构造函数中查找-->对象的原形-->构造函数的原形中查找-->当前原形的原形查找
4.原形链?
4.1就是把原形串联起来
4.2原形链的最顶端是null
11.防抖和节流是什么
都是应对页面重频繁触发事件的优化方案
防抖:避免事件重复出发,n秒后触发
使用场景:1.频繁和服务端交互 2.输入框自动保存事件
节流:把频繁触发的事件减少,每隔一段时间执行
使用场景:scroll滚动事件
12.什么是json?
JSON是一种纯字符串形式的数据,它本身不提供任何方法,适合在网络中进行传输
JSON数据存储在.json文件中,也可以把JSON数据以字符串存储在数据库,cookie中
JS提供了JSON.parse() JSON.stringify()
什么时候使用json:定义接口;序列化;生产token,配置文件
13. 有没有做过无感登录?
1.在响应器中拦截,在判断token返回过期后,调用刷新token的接口
2.后端返回过期时间,前端判断token的过期时间,然后调用刷新token的接口
3.写定时器,定时刷新token接口
流程:
1.登录成功后保存token和refresh_token
2.在响应拦截器中对401状态码引入刷新token的api方法
3.替换保存本地新的token
4.把错误对象里的token替换
5.再次发送未完成的请求
6.如果refresh_token过期了,判断是否过期,如果过期清除所有token重新登录
14.大文件上传是怎么做的?
分片上传:
1.把需要上传的文件按照一定的规则,分割成相同大小的数据块
2.初始化一个分片上传任务,返回本次分片上传的唯一标识
3.按照一定的规则把各个数据块上传
4.发送完成后,服务端会根据数据上传的完整性,如果完整,那么就会把数据库合并成原始文件
断点续传:
服务端返回,从哪里开始 浏览器自己处理
15.get和post请求有什么区别
1.get一般是获取数据,post一般是提交数据
2.get参数会放在url上,所以安全性比较差,post请求退回时会重新提交数据
3.get请求刷新服务器或退回是没有影响的,post请求退回时会重新提交数据
4.get请求时会被缓存,post请求时不会被缓存
5.get请求会被保存再浏览器历史记录种,post不会
6.get请求只能进行url编码,post请求支持很多种
16.Promise的内部原理是什么?它的优缺点是什么?
Promise对象,封装了一个异步操作并且还可以获取成功或失败的结果
Promise主要是解决回调地狱的问题,之前如果异步任务比较多,同时他们之间有相互依赖的关系,就只能使用回调函数处理,这样容易形成回调地狱,代码可读性差,维护性也差
有三种状态:pending初始状态 fulfilled成功状态 rejected失败状态、
状态改变只会有两种情况
pending->fulfilled; pending->rejected
缺点:无法取消promise,一旦创建就会立即执行,不能中途取消
如果不设置回调,promise内部抛出的错误就无法反馈到外面
若当前处于pending状态时,无法得知目前处在哪个阶段
原理:
构造一个Promise实例,实例需要传递函数参数, 这个函数有两个形参,分别都是函数类型,一个是resolve,一个是reject
promise上还有then方法,这个方法就是来指定状态改变时的确定操作,resolve是执行第一个函数,reject是执行第二个函数
17.ES6新特性
1.新增块级作用域(let,const)
let声明变量,const声明常量(不存在变量提升,存在暂时性死区,不能在同一个作用域内重复声明)。 var存在变量提升,在变量声明前可以用
2.新增了定义类的语法糖(class)
3.新增了一种基本数据类型(symbol)
4.新增了解构赋值
5.新增了函数参数的默认值
6.给数组新增了API
7.对象和数组新增了扩展运算符
8.Promise
解决回调地狱问题
自身有all,reject,resolve,race方法
原型上有then,cath方法
把异步操作队列化
三种状态:pending初始状态,fulfilled操作成功,rejected操作失败
状态:pending-> fulfilled;pending->rejected
async await 同步代码做异步的操作,两者必须搭配使用
async 表明函数内有异步操作,调用函数会返回promise
await是组成async的表达式,结果是取决于它等待的内容,如果是promise返回peomise结果,如果是普通函数,直接链式调用
await后的promise如果是reject状态,那么整个async函数都会中断,后面的代码不会执行
9.新增了模块化引入(import,export)
10.新增了set和map数据解构
set就是不重复
map的key的类型不受限制