前端面试总结【6月份面试—网易外包、嘉联支付面试题】

1,844 阅读15分钟

JavaScript

0.1 + 0.2 === 0.3 嘛?为什么?

不等于,0.1,0.2转换成二进制以后无限循环,导致精度丢失,js的精度问题,会导致计算结果多数很多位小数

JS 数据类型JS 整数是怎么表示的?

Js中可以用十进制、八进制【0前缀】、十六进制【0x前缀】表示整数

Number() 的存储空间是多大?如果后台发送了一个超过最大自己的数字怎么办

利用Bigint,BigInt是一种新的数据类型,用于当整数值超过Number的范围时

事件流

备注:不要和事件循环弄混了

事件流:当每个事件发生时,事件的传播过程

分为三个阶段:捕获、目标事件、冒泡;事件的捕获顺序是从最外层开始,然后到具体的元素,事件冒泡则和事件捕获相反;

事件是如何实现的?

事件是某种操作或者规定规则触发的操作,事件分为上面三个阶段

new 一个函数发生了什么

  1. 创建一个空对象
  2. 将该对象的_proto_属性指向构造函数所有的prototype
  3. 将构造函数的this指向自己【基本数据类型没有这一步】

prototype/_proto_的区别

prototype为显示原型,_proto_为隐式原型;

每个函数创建以后都会有prototype属性,这个属性指向原型对象;

同时每一个对象都会有内置的[[prototype]]属性,可以通过_proto_访问;

显示原型用于实现 基于原型的继承和属性的共享

隐式原型用于 构成原型链

promise介绍

promise主要解决的是异步编程问题;

在这之前我们实现异步,会通过回调函数处理;传统的回调函数实现异步的写法,代码不是很友好,而promise通过then结合链式操作就增强了代码可读性;

promise对象有三种状态:pending/fulfilled/rejected

Promise对象是一个构造函数,接受一个函数作为参数,这个函数有两个参数,分别是resolve,reject

事件循环/eventloop?

js当中可以把任务分为同步任务、异步任务;同步任务先指向,然后再去执行异步任务;

同时还可以再仔细的划分,将任务划分成微任务和宏任务;

当前宏任务中的执行顺序为:执行主函数,然后执行微任务,然后进行下一个宏任务;

  1. 执行同步事件/主函数

  2. 如果执行栈为空,就去看有没有微任务需要执行

  3. 微任务如果执行完了,就去看有没有下一个宏任务要执行

微任务:Async/await、promise后面相关的任务会被插入微任务列表

宏任务:Settimeout

async与await的介绍

介绍+和promise的关系

async函数返回一个promise对象;

await的后面,是一个promise对象,要求返回对象的结果,如果不是promise对象,就直接返回对应的值;

其出现是为了解决 Promise 的缺点(语义不清,代码冗余)

如何将两个异步改为同步

使用await关键字来等待异步操作的结果,直到异步操作完成后再继续执行下面的代码(相当于实现了同步)

输入框输入,请求后台接口,第一个接口返回的信息可能比较慢,到第二次调用后信息已经返回了,前一条数据才出来,如何避免页面被第一个接口返回的信息覆盖?

(面试官:可以在axiox response拦截,比对我我们发送的参数,进行比较,然后筛选出后输入值返回的数据)

多维输入,如何判断数组的最深层有多少层?例如: [1,3,3[4,6,7,[5,6,7,43,[23,4]]]], 返回 4

第一种:递归,但是,是不是杀鸡用牛刀?
第二种:数组转化为字符串,然后查出多少个‘[’活着‘]’

箭头函数和普通函数区别??this指向??

箭头函数没有自己的this;箭头函数的定义更简洁;箭头函数继承来的this指向永远不会变,所以call,bind,apply都无法改变其指向;不能作为构造函数使用,没有自己的arguments,没有prototype;

介绍闭包??for循环结果输出??如何修改得到正确的输出??

闭包让你可以在一个内层函数中访问到其外层函数的作用域;

每当创建一个函数的时候,闭包就会被创建,作为函数内部和外包连接在一起的桥梁;

webpack怎么分包

一般情况下,组件和组件之间相互依赖的时候,就会把相关的组件全部打包;

但是如果项目太大,就可以把一些不需要立即使用的组件,单独拆分成一个chunk打包

webpack Module Feduration与npm的优缺点

包管理工具

npm发包需要经历构建,发布,引用三阶段,过程繁琐。

var,let,const区别

var会提升为全局,并且可以重复定义

let不会提升为全局,不能重复定义

Const不会提升为全局,不能修改

如何实现数组拍平??多种方式实现

Arr.flat()、toString()、arr.join().split(',')

webpack中module,chunk,bundle的区别

bundles是指webpack打包后文件的统称

chunk的意思是代码块,一个bundle由一个或者多个chunk组成,一个chunk由一个或多个module组成

webpack中的module模块即文件,每个文件都被看做一个模块

原型和原型链

每一个对象,都有一个原型对象;

当访问对象的属性是,不仅在当前对象上搜索,还会搜索对应的原型,以及原型的原型;

因为原型对象也可能拥有原型,并且继承其中的方法和属性,那么一层一层,就构成了原型链;

js的数据类型

简单数据类型:undefined、null、boolean、string、number、symbol

引用数据类型:object

数组的常用方法

遍历相关的数组方法

forEach/map/some/every/filter/slice

forEach/map的区别

forEach()允许callback更改原始数组的元素。但是不是直接通过改回调函数的第一个参数,而是通过arr[index]去修改;

forEach是不会返回有意义的值的;map()会返回一个全新的数组;

插入删除相关的

push/pop/shift/unshift/splice

定位

indexOf/lastIndexOf

其他

reverse/contact/sort/length

怎么判断是数组类型

Array.isArray/instanceof/Object.prototype.toString

HTML

HTML5

html5是html的新特性;

和html的区别

html的声明很长,html5只需要一行就行

html5的新特性

新增了语义化标签:

新增了标签:

canvas、websocket

部分标签新增属性:input标签新增了placeholder/required

history的API:go/forward/back

websocket

websocket是如何实现的??它传输的是二进制还是文本??

一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议,基于tcp传输协议,并复用HTTP的握手通道;浏览去和服务器只需要完成一次握手,就可以建立持续性的数据传输,实现双向数据传递;

优点:

支持二进制传输也可以发送文本;

数据格式轻量所以开销小;

不同于半双工通信,因为是全双工,所以服务端和客户端都可以主动发送数据;

和http的区别

http是单向的,有客户端发送请求,服务端响应数据;

每次的请求和响应都是对应的,发送响应后,服务端就会和客户端断开连接;

Doctype标签作⽤?

Doctype告诉浏览器该文件的类型,以便浏览器知道用对应的规范来解析文档渲染页面

严格模式与混杂模式如何区分?

严格模式下,浏览器按照标准解析代码;混杂模式下,浏览器按照自己的标准解析代码;

如果文档包含严格的 DOCTYPE ,那么它一般以严格模式呈现;

反之则为混杂模式;

严格模式有何意义?

消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

消除代码运行的一些不安全之处,保证代码运行的安全;

提高编译器效率,增加运行速度;

如何实现浏览器内多个标签页之间的通信?

broadcast channel【只能用于同源的页面】

// 初始化
const setChannel = new BroadcastChannel('demos');

// 发送数据
setChannel.postMessage('要发送消息啦啦啦啦啦啦啦');

// 接受数据
setChannel.onmessage =function(e) {
    console.log('接收到消息:', e.data);

};

localStorage【是浏览器多个标签共用的存储空间】

postMessage

// 发送
     window.postMessage(
        JSON.stringify({
          from: 'income',
          action: 'resetSpendingDetails',
          limitYear: value,
        }),
        '*'
      );
// 接收
window.addEventListener('message', handleActions);、

⾏内元素有哪些?块级元素有哪些?空(void)元素有哪些?⾏内元素和块级元素有什么区别?

行内:div/p/h1.../form/table

块级:a/span/br/i/strong/em

空元素:br/img

简述⼀下src与href的区别?

href 是超文本引用,它是指向资源的位置,建立与目标文件的联系;src 目的是把资源下载到页面中;

关于页面的加载,css的解析会影响js的执行吗?css加载会影响吗?

Js的执行过程中可能会有跟css有关的操作,所以在执行之前会要求先下载解析完css

CSS

flex布局

flexbox弹性布局,可以响应式实现页面布局;

常用属性有:

flex-direction:决定主轴的方向

flex-basis:元素在主轴上的初始尺寸

flex-grow:放大比例,默认为0

flex-shrink:缩小比例,默认为1

flex-wrap:是否换行

justify-content:元素在主轴上的对齐方式

align-items:元素在交叉轴上如何对齐

align-content:多根轴线的对齐方式

关于flex布局,如何实现垂直居中?水平居中

利用justify-content、align-items、align-content

主轴和纵轴区别:相互垂直的交叉轴

请你讲一讲CSS 的权重和优先级

内联样式>id>class>标签

CSS 怎么画一个大小为父元素宽度一半的正方形?

设置宽度为50%,+设置padding-top/bottom/left/right[ padding的取值是百分比时,他是相对于父元素的宽度]

CSS实现自适应正方形、等宽高比矩形

  1. 使用相对单位

  2. 利用百分比设置宽度+padding

实现两栏布局的方式

某一列固定宽度,另一侧不设置宽度,会自适应

实现三列布局的方式

  1. 两边固定宽度,中间的宽度自适应

  2. 用flex实现,两边设置占据主轴的空间flex-basis,中间设置flex-grow

  3. 两边用float,中间动态计算宽度

圣杯布局:中左右都在一个div里,利用padding+float

双飞翼布局:中间和左右不在一个div里,利用margin+float

CSS 动画有哪些

Animation/transition/transform(一般都是配合前面两个使用)

transform定位和css中top,left定位区别

使用 top left 定位是直接改变元素真实位置的,距离父容器顶部、左边的距离

Transform只是改变视觉效果,不会改变元素的真是位置,所以就不会导致回流

移动端的样式适配

利用@media,设置不同屏幕的样式

使用相对单位rem

使用flexible适配

使用viewport适配方案:vw\vh

less的优点

是一个css预处理器,编译后会生成css应用于浏览器;

支持跨浏览器兼容性;

可以使用嵌套、变量、有一系列运算符(+*/-)可以用、提供了合并属性、可以设置默认值、可以接收多个值(比如transform,transition)

css模块化

import styles from './progressLine.module.less';
// .module.less或者.less的文件都可以,css也可以,这里没有限制
// .module.less模块化引入样式只作用于当前组件,不影响后代组件

<div className={styles.point}/>

计算机网络基础

HTTP 缓存/http缓存【浏览器缓存】和缓存的意义,怎么区分

浏览器每次发起请求时,先在本地缓存中查找结果以及缓存标识,根据缓存标识来判断是否使用本地缓存。

浏览器的缓存分为:强缓存[如果存在这个缓存就直接使用]>协商缓存[会向服务器询问资源是否更新]>webStorage缓存

通过标识来判断是否有强缓存;

HTTP 常用的状态码及使用场景?

1xx:服务端收到请求

2xx:请求成功相关状态

3xx:重定位相关

4xx:客户端错误

5xx:服务端错误

你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?

HTTP 常用的请求方式,区别和用途?

Get不会修改服务器资源,get的请求报文中实体为空【即无入参】,具体入参是在url里的,这样不安全,也因为放在url里所以会有长度限制

post会影响服务器资源

关于浏览器,从URL输入,到页面的完全展现,都经历了什么?

输入url——解析url地址内容——看是否有缓存,有就直接用,没有就——与服务器建立TCP链接——链接成功后开始发送请求——服务器处理请求并返回http报文——浏览器拿到数据进行html、css等内容的解析并且缓存可以缓存的数据——界面渲染——连接结束

三次握手和四次挥手

三次握手的本质是要确认双方的接收和发送数据的能力

四次挥手:客户端通知服务器关闭连接——服务端告诉客户端开始关闭连接——服务端处理完最后数据告诉客户端可以关闭——客户端最后确认然后双方关闭

http和https的区别是什么?

HTTPS 则解决 HTTP 不安全的缺陷

http是明文传输,https则进行了加密处理

http进行tcp三次握手建立连接,https在这个基础上添加了一种安全协议来着

https还会向ca机构申请安全证书来保障服务器的安全可信

http2新特性??介绍二进制分包实现??说一下头部压缩的原理??

新特性:头部压缩、报文改为二进制格式、一个连接中并发多个请求或回应、数据流(数据包不是按顺序发送的,每个包有自己的编号)

二进制分包实现: 【暂缓】

头部压缩:如果同时发出了多个请求,http2会消除重复的内容

你对计算机网络的认识怎么样/计算机网络模型

对网络的体系结构进行了各种划分,每层都有自己的协议或者规则;

按照不同的维度,其常被分为七层、五层、四层网络结构;

应用层:为应用进程提供服务;有HTTP/FTP/DNS等协议

传输层:为两台主机中的进程提供通信服务;

网络层:为两台主机提供通信服务,选择合适的路由将数据传递给目标主机

数据链路层:将 IP 数据报封装成帧,并在链路的两个相邻节点间传送帧

物理层:确保数据可以在各种物理媒介上进行传输

编程题

  1. 节流函数
  2. js判断对多个版本号进行排序怎么做?

React

useState哪些情况下是同步,哪些是异步

在正常的react的事件流里:setState和useState是异步执行的(不会立即更新state的结果),多次执行setState和useState,只会调用一次重新渲染render,不同的是,setState会进行state的合并,而useState则不会;

在setTimeout,Promise.then等异步事件中,setState和useState是同步执行的(立即更新state的结果),多次执行setState和useState,每一次的执行setState和useState,都会调用一次render

useMemo\useCallback主要的作用

useMemo和useCallback都会在组件第一次渲染的时候执行,之后会在其依赖的变量发生改变时再次执行;并且这两个hooks都返回缓存的值,useMemo返回缓存的变量,useCallback返回缓存的函数。

// 不希望某个函数,因为不相关的state更新就重新计算,那么使用useMemo,使得函数在只有相关的state值发送变化时才重新计算
const expensive = useMemo(() => {
        console.log('compute');
        let sum = 0;
        for (let i = 0; i < count * 100; i++) {
            sum += i;
        }
        return sum;
}, [count]);
const callback = useCallback(() => {
        console.log(count);
}, [count]);

useEffect,useLayoutEffect的区别

【大致理解为:useEffect 是在渲染结束后执行;useLayoutEffect则是DOM在缓存中,没有被渲染之前执行】

useLayoutEffect 与 useEffect 的功能是一样的,但是它们调用react的内部方法不同

useLayoutEffect 是同步调用,在执行的过程中是先调用React内部的mountLayoutEffect,然后再调用mountEffectImpl, 注意 componentDidMount componentDidupdate 与 useLayoutEffect 一样;

useEffect 是异步调用 执行的时候则是调用的mountEffect,最后再调用的方法也跟useLayoutEffect一样;

react的周期—挂载、渲染、卸载

dva怎么用的

react常用的hook

平时写过的hook,为什么要用hook,做了什么功能

通过自定义 Hook,可以将组件逻辑提取到可重用的函数中。也就是一个用来放重复代码的函数;

react数据传递方式

兄弟组件的数据传递怎么处理

useRef怎么用的

怎么封装自己的组件和复用实现方法

怎么封装函数