JS知识整理---面经题

226 阅读5分钟

基于【🐯初/中级前端面经】中小型公司面试时都会问些什么? - 掘金 (juejin.cn)整理

js数据类型

​ 1、 基本数据类型

​ 1-1. Number 数值类型

​ 1-2. String 字符串类型

​ 1-3. Boolean 布尔类型

​ 1-4. Undefined 空类型

​ 1-5. Null 空类型

​ 1-6. Symbol 表示唯一的值

​ 2、 复杂数据类型

​ 2-1. Object 对象类型

​ 2-2. Array 数组类型

​ 2-3. Function 函数类型

BFC

BFC是一个独立的渲染区域,规定了块元素如何排版布局

BFC的布局规则

1、定义快元素垂直排列,上下显示

2、同一个BFC区域内,上下的盒子margin会重叠

3、盒子左边的外边距会跟边框接触

4、BFC区域和浮动区域不会重叠

5、每个BFC都是独立的容器,相互之间不会影响

6、计算BFC高度时,浮动元素也参与高度计算

BFC的触发条件

根元素(html)

float属性不为none

position为absolute或fixed

display为inline-block、flex

overflow值为hidden、auto、scroll都会触发BFC

用BFC解决什么问题

1、自适应两栏布局(后台管理系统的布局)

2、BFC解决高度塌陷 (高度塌陷:如果用高度自适应,不管是min-height,还是不设置高度,如果内容浮动后,内容不占位,父元素识别不了内容的高度,高度塌陷)

3、BFC解决margin重叠

外边距常见的问题

1、上下margin重叠问题 如果两个盒子,上下显示,两个盒子中间都设置了外边距,上下的外边距会重叠,谁大听谁的

2、margin-top的传递问题 当父元素下的第一个子元素设置margin-top的时候,margin-top会错误的传递给父元素

盒模型

标准盒模型

总宽度:width+左右的padding+左右的border

怪异盒模型

总宽度:width(包含border和padding)

转换成怪异盒模型 box-sizing:border-box

axios请求拦截:

内部提供的CancelToken来取消请求

axios.get('/user/12345', {
    cancelToken: source.token 
    }).catch(function(thrown) {
        if (axios.isCancel(thrown)) { 
        console.log('Request canceled', thrown.message); 
    } else { // 处理错误 } });

XSS、CSRF

  1. 防御 XSS 攻击---跨站脚本攻击

    • HttpOnly 防止劫取 Cookie
    • 用户的输入检查
    • 服务端的输出检查
  2. 防御 CSRF 攻击---跨站请求伪造

    • 验证码
    • Referer Check
    • Token 验证

如何解决跨域问题

协议、域名、端口号 任意一个不同就是跨域

jsonp、nginx反向代理、cros后端处理

  • CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案

  • JSONP只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

  • 不管是Node中间件代理还是nginx反向代理,主要是通过同源策略对服务器不加限制。

跨域问题实际上改的是 http 里面哪个参数

Access-Control-Allow-Origin

ES6新特性

解构赋值、函数入参初始化、symbol、扩展运算符(...)、set(它类似于数组,但是成员的值都是唯一的,没有重复的值。)、map

promise 都有哪些方法

then、catch、all、allSettled、race、any

看了就会,手写Promise原理,最通俗易懂的版本!!

虚拟 dom 和真实 dom 的区别

  • 虚拟 DOM 不会进行排版与重绘操作 
  • 虚拟 DOM 就是把真实 DOM 转换为 Javascript 代码
  • 虚拟 DOM 进行频繁修改,然后一次性比较并修改真实 DOM 中需要改的部分,最后并在真实 DOM 中进行排版与重绘,减少过多 DOM 节点排版与重绘损耗

组件传值的 n 种方式

props、$refs、子父通信($emit)、bus事件总线(非父子关系的组件通信)、vuex

bus事件总线
  1. 定义
Vue.prototype.$bus = new Vue()
  1. 向bus事件总线发送数据
bus.$emit(自定义事件名,数据包)
  1. 监听自定义事件,接收数据
bus.$on(自定义事件名,回调函数(参数))

ts 和 js 的优缺点

  • ts 是 js 的超集,即你可以在 ts 中使用原生 js 语法。
  • ts 需要静态编译,它提供了强类型与更多面向对象的内容。
  • ts 最终仍要编译为弱类型,基于对象的原生的 js,再运行。

闭包

闭包 即可以长久的保存变量,又不会造成全局污染

闭包就是能够读取其它函数内部变量的函数。

函数柯里化

fun(){
  returnfun()
}
fun()()()调用

微任务、宏任务、事件循环

宏任务:setTimeOut、setTimeInterval、同步任务:script代码块

微任务:Promise.then

事件循环:

  1. 宏任务:同步任务;setTimeOut回调进入宏任务队列

  2. 所有微任务

  3. 一个事件循环结束

  4. setTimeOut回调

从输入 url 到页面渲染完成之间发生了什么

  1. DNS解析url真实地址

  2. http请求

  3. tcp连接

  4. 拿到http请求报文

  5. 页面渲染

http 状态码都有哪些

1XX 表示消息

2XX 表示成功

3XX 表示重定向

4XX 表示请求出错

5XX 表示服务器出错

localStoragesessioncookie 的区别是什么

localStoragesessioncookie
5M5M4KB
本地存储会话存储用于标识用户身份
只有主动清空的时候,才会清空页面关闭、浏览器关闭,都会清空服务器生成:可设置失效时间;
(一般) 浏览器生成:关闭浏览器失效;

原型对象、原型链

原型:每个对象所关联的__proto__(每一个对象从被创建开始就和另一个对象关联,从另一个对象上继承其属性,这个另一个对象就是 原型。)

这条由对象及其原型组成的链就叫做原型链。

用 Object.create(null) 创建的对象没有原型。

原型对象是为了解决构造函数中会存在方法,避免不必要的空间浪费

原型对象:构造函数.prototype=> 实例.fun指向同一内存空间

构造函数.prototype.fun=function()

Person.prototype === p1.__proto__;   // true
Person.prototype === p2.__proto__;   // true
p1.__proto__ === p2.__proto___;      // true

构造函数.prototype.constructor===构造函数

function Person() {
   // ...
}
console.log(Person.prototype.constructor === Person); // true

image.png

vue生命周期

image.png