面试笔记

376 阅读9分钟

JS

原型/继承

原型:每创建一个新函数,会根据特定规则为该函数创建一个Prototype属性指向函数的原型对象。原型对象会自动获得一个constructor属性,指向prototype属性所在的函数指针。

函数经过调用成为构造函数,返回一个新的实例对象,这个对象有个_proto_属性,指向构造函数的原型对象。

原型链:对象通过_proto_指向父类对象,直到object对象为止。

  • 使用hasOwnProperty()检查对象自身是否含有该属性。
  • 使用in检查对象及原型链中是否存在某个属性。

JavaScript深入之继承的多种方式和优缺点 

详解JS原型链与继承

执行上下文/作用域/闭包

JavaScript深入之词法作用域和动态作用域 

JavaScript深入之执行上下文栈 

this

JavaScript深入之call和apply的模拟实现 

JavaScript基础心法——this 

Promise

Promise的源码实现(完美符合Promise/A+规范)

深浅拷贝

JavaScript基础心法——深浅拷贝

JavaScript专题之深浅拷贝 

Eventloop

Eventloop不可怕,可怕的是遇上Promise

一篇文章教会你Event loop——浏览器和Node

es6

HTML

h5:

标签:新增语义标签(aside/figure/section/header/footer/nav),多媒体标签(video/audio)

属性:增强表单,增强input的type属性;meta增加charset设置字符集;script增加async异步加载脚本

存储:localStorage/sessionStorage/indexDB

API:增加拖放API,地理定位,SVG绘图,canvas绘图,Web Worker,WebSocet

CSS

清除浮动

  • 给父元素添加float,这样让父元素跟子元素一起脱离文档流浮动
  • 给父元素一个固定高度
  • 新建一个空的div,设置clear:both
  • 给父元素添加overflow:hidden
  • 通过伪类::after

::after{
 content:"";
 clear:both;//清除浮动
 display:block;//确保是一个块级元素
 }

BFC

不会发生margin重叠;解决子元素浮动带来的高度坍塌和文字环绕。

创建方法:根元素;浮动元素float:left;right绝对定位元素(position:absolute fixed)display:inline-blocks;table-cell; flexoverflow:hidden;scroll;auto;inherit
特性内部的盒会在垂直方向一个接一个排列   box垂直方向的距离由margin决定     每个盒子的左边距与包含块的左边缘接触   是页面上的一个独立容器   bfc的高度包含所有元素及浮动元素  bfc不与float box重叠、

,position:absolute;top:50%;left:50%。不同的是,接下来需要使用transform:translate(-50%,-50%),实现垂直居中

居中

  • 水平居中:
内联或类内联元素(譬如文本或链接)
text-align:center
块级元素
margin:0 auto

  • 垂直居中
内联或类内联元素(譬如文本或链接)
已知文本不会换行,让line-height和height相等,从而实现垂直居中
多行
当父级容器拥有确定高度的元素,使用flexbox。对于父容器display:flex,它的每一个子元素都是垂直居中的
幽灵元素:在垂直居中的元素上添加伪元素,设置伪元素的高等于父级容器的高,然后为文本添加vertical-align:middle样式

  • 块级元素
如果我们不知道元素的高度,那么就需要将元素定位到容器的中心位置,然后使用transform属性,将元素的中心和父容器的中心重合,从而实现垂直居中。
如果无法获取确定的宽高,同样需要设定父级容器为相对定位的容器,设定子元素绝对定位的位置,position:absolute;top:50%;left:50%。不同的是,接下来需要使用transform:translate(-50%,-50%),实现垂直居中

flexbox {display:flex;justify-content:center;align-items:center}

position

relative:相对于默认位置进行偏移,搭配top left bottom right进行指定位置的偏移;
absolute:相对于上级非static元素进行偏移 搭配top left bottom right进行指定位置的偏移;
fixed:相对于浏览器视口固定;
static 正常的页面流;
sticky relative和fixed结合 必须搭配top bottom left right不能省略 否则等同于relative

伪类&&伪元素

伪类
为了通过选择器,格式化DOM以外的信息以及不能被常规CSS选择器获取到的信息。
  1. 格式化DOM以外的信息。 <a> 中的:link,:visited.这些信息不存在于DOM树中
  2. 不能被常规CSS选择器获取到的信息。 :first-child
添加选择器的特殊效果;
基于元素的特征而不是ID class
伪元素
创建文档语言无法创建的虚拟元素。描述内容的第一行 ::first-letter ::first-line
创建源文档不存在的内容 。 ::before ::after
区别:
伪类弥补CSS选择器的不足,方便的获取信息。 动画交互(滑入滑出) 用单冒号表示
伪元素创建了一个虚拟容器,在其中添加内容或样式 。 字体图标,清除浮动 双冒号

盒模型

  • ie盒模型: 此模型下的宽度计算为border+padding+content的宽度总和
box-sizing:border-box
  • w3c模型:元素的宽度计算为content
box-sizing:content-box


浏览器

浏览器缓存

  • 强缓存(expires/cache-control)
  • 协商缓存(e-tag/last-modify)
  • 缓存位置(ServiceWorker/Memory Cache/Disk Cache/Push Cache)

浏览器本地存储

  • Cookie/SessionStorage/LocalStorage/IndexDcB

cookie属性详解

http/https/TCP/UDP

http1.0/http1.1:长连接/缓存处理/带宽处理/host头处理

http2.0新特性:多路复用/服务器端推送/二进制传输/heade头部压缩

http3.0 :UDP

https/http:

  • https使用443端口,http使用80
  • http是超文本传输协议,明文传输;https经过ssl加密的协议,传输更安全
  • https除了tcp握手的三个包,还要加上SSL握手的九个包
对称加密:客户端和服务器公用一个密钥来对消息加解密。

非对称加密:

非对称加密概述

(建议精读)HTTP灵魂之问,巩固你的 HTTP 知识体系

跨域

正确面对跨域,别慌

安全

CSRF:跨站请求伪造。

--验证Token

XSS:跨站脚本注入。利用网页开发时留下的漏洞,注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。

--输入检查。代码转义或过滤。/设置httpOnly(防止获取cookie)/开启CSP

--

非对称加密:

从输入URL到页面呈现过程发生了什么(重绘回流&&Eventloop)

segmentfault.com/a/119000000…

深入浅出浏览器渲染原理

从输入url到页面展示到底发生了什么

为什么tcp连接的时候是三次握手,关闭的时候是四次握手

(01)老生常谈的从 URL 输入到页面展现背后发生的事 | Web 前置知识

浏览器渲染机制


回流:DOM结构的修改引起DOM尺寸变化。(几何属性变化,DOM节点发生增减移动)

过程:生成DOM树,计算样式,生成布局树,建图层树,绘制列表

重绘:DOM的修改导致样式的变化但是没有影响到几何属性。

React

react-fiber/diff

React Fiber是什么

React 源码剖析系列 - 不可思议的 react diff

浅谈React diff算法与key

生命周期

componentWillMount 在渲染前调用,在客户端也在服务端。 

componentDidMount : 在第一次渲染后调用,只在客户端。之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。 如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异步操作阻塞UI)。

componentWillReceiveProps 在组件接收到一个新的 prop (更新后)时被调用。这个方法在初始化render时不会被调用。

shouldComponentUpdate 返回一个布尔值。在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。 
可以在你确认不需要更新组件时使用。

componentWillUpdate在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。

componentDidUpdate 在组件完成更新后立即调用。在初始化时不会被调用。

componentWillUnmount在组件从 DOM 中移除的时候立刻被调用。

redux/redux-thunk/react-route-dom

redux

Store:Redux只有一个Store,Store的State不能直接修改,每次只能返回一个新的State。

使用createStore函数生成Store。

使用store.subscribe方法设置监听函数一旦State发生变化就自动执行这个函数。

Action:Action就是View发出的通知,State要改变。store.dispatch是view发出Action的唯一方法。有一个Type属性,代表名称。

Reducer:纯函数。combineReducers把多个reducer合成一个根Reducer。

流程:

  1. 用户通过View发出Action。

    store.dispatch(action)

  2. Store自动调用Reducer,传入两个参数,当前State和收到的Action,返回新的State

    xxReducer(previousState,action)
  3. State一旦有变化,Store会调用监听函数。

    store.subscribe()

  4. store通过getState得到当前状态,重新触发渲染。
    setState(store.getState())

react-redux

Provider:Provider从外部封装了整个应用,并向connect传递store

connect:连接react&&redux。

  • 将store通过mapStateToProps进行筛选后使用props注入组件
  • 根据mapDispatchToProps创建方法,

(mapStateToProps,mapDispatchToProps)

10行代码看尽redux实现 —— 全面剖析redux & react-redux & redux中间件设计实现 | 8k字

高阶组件

高阶组件接收react组件为参数,返回一个新的React组件。本质上是一个函数。

主要是封装并分离组件的通用逻辑,让通用逻辑在组件间更好的复用。

--与DOM操作不直接相关的。--请求发送,数据校验。

Redux-connect

React 深入系列6:高阶组件

React优化

  • shouldComponentUpdate
  • 不可变性:不要对数据进行修改,在现有集合的基础上创建新的集合。保持尽可能少的复制,提高性能。
  • 显示列表是使用keys,让React更新速度更快。
  • 代码分离,只加载模块或所需的文件的技术。

浅谈react性能优化的方法

react优化


React-Native

React Native运行原理解析

Hybrid开发中JSBridge的实现

JSBridge的原理及使用


性能优化

性能优化入手

  • 分屏加载,页面需要渲染的数据较多时,先渲染首屏,下滑时再加载第二屏的数据。
  • 图片大小优化,不影响视觉效果的前提下,把图片尺寸降到最低。
  • 图片懒加载。
  • Codesplitting,拆包,动态import
首屏渲染
  • 降低请求量:合并资源,减少http请求数,gzip压缩,懒加载
  • 加快请求速度:cdn分发,预解析DNS,
  • 增加缓存:离线缓存数据
  • 渲染优化:首屏内容最小化,JS/CSS优化,加载顺序

工程化

webpack


其他:

(1.6w字)浏览器灵魂之问,请问你能接得住几个?

2万字 | 前端基础拾遗90问

阿里前端攻城狮们又写了一份面试题答案,请查收|掘金技术征文

(中篇)中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂

合格前端系列第九弹-前端面试那些事