JavaScript面试题

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的类型不受限制

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值