JavaScript
0.1 + 0.2 === 0.3 嘛?为什么?
不等于,0.1,0.2转换成二进制以后无限循环,导致精度丢失,js的精度问题,会导致计算结果多数很多位小数
JS 数据类型JS 整数是怎么表示的?
Js中可以用十进制、八进制【0前缀】、十六进制【0x前缀】表示整数
Number() 的存储空间是多大?如果后台发送了一个超过最大自己的数字怎么办
利用Bigint,BigInt是一种新的数据类型,用于当整数值超过Number的范围时
事件流
备注:不要和事件循环弄混了
事件流:当每个事件发生时,事件的传播过程
分为三个阶段:捕获、目标事件、冒泡;事件的捕获顺序是从最外层开始,然后到具体的元素,事件冒泡则和事件捕获相反;
事件是如何实现的?
事件是某种操作或者规定规则触发的操作,事件分为上面三个阶段
new 一个函数发生了什么
- 创建一个空对象
- 将该对象的_proto_属性指向构造函数所有的prototype
- 将构造函数的this指向自己【基本数据类型没有这一步】
prototype/_proto_的区别
prototype为显示原型,_proto_为隐式原型;
每个函数创建以后都会有prototype属性,这个属性指向原型对象;
同时每一个对象都会有内置的[[prototype]]属性,可以通过_proto_访问;
显示原型用于实现 基于原型的继承和属性的共享
隐式原型用于 构成原型链
promise介绍
promise主要解决的是异步编程问题;
在这之前我们实现异步,会通过回调函数处理;传统的回调函数实现异步的写法,代码不是很友好,而promise通过then结合链式操作就增强了代码可读性;
promise对象有三种状态:pending/fulfilled/rejected
Promise对象是一个构造函数,接受一个函数作为参数,这个函数有两个参数,分别是resolve,reject
事件循环/eventloop?
js当中可以把任务分为同步任务、异步任务;同步任务先指向,然后再去执行异步任务;
同时还可以再仔细的划分,将任务划分成微任务和宏任务;
当前宏任务中的执行顺序为:执行主函数,然后执行微任务,然后进行下一个宏任务;
-
执行同步事件/主函数
-
如果执行栈为空,就去看有没有微任务需要执行
-
微任务如果执行完了,就去看有没有下一个宏任务要执行
微任务: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实现自适应正方形、等宽高比矩形
-
使用相对单位
-
利用百分比设置宽度+padding
实现两栏布局的方式
某一列固定宽度,另一侧不设置宽度,会自适应
实现三列布局的方式
-
两边固定宽度,中间的宽度自适应
-
用flex实现,两边设置占据主轴的空间flex-basis,中间设置flex-grow
-
两边用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 数据报封装成帧,并在链路的两个相邻节点间传送帧
物理层:确保数据可以在各种物理媒介上进行传输
编程题
- 节流函数
- 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,可以将组件逻辑提取到可重用的函数中。也就是一个用来放重复代码的函数;