八股文

141 阅读9分钟
  • 1、继承、原型链

原型【proto,prototype】通过特定构造函数实例化的对象,都可以访问圆形对象的方法,圆形对象是实例的公共访问容器-》查找变量过程-》原型链,好处:继承-〉方法继承,属性继承,

  • 闭包

js中函数的执行有一个执行站(该执行站有创建函数上下文,即作用域,总用于中的变量)如果有函数嵌套,那么外层函数先入展,内层函数后入展,而执行刚好是后劲先出,内部函数执行完,出战,销毁上线问、作用域等,因此外层函数访问不到内部变量

\

函数执行栈(上下文、作用域中的变量,执行完出战,销毁上下文机器变量,如果有函数嵌套,那么外层先入,内层再入,执行时内层先出站外层访问不到内层)-》特殊情况:一个函数,返回一个函数,返回函数访问了外层函数变量,形成了闭包

\

function out() {

Const a = 1

Return () => {

a++

}

}

Fun = out()

Fun

\

  • 2、原生js有哪些缺点
  • 3、简述同步和异步的区别

js是单线程的,他的执行像一个流水线,一次只能执行一段代码,我们可以叫做任务;

任务分为同步任务和异步任务;

同步任务是主线程上排队执行的任务,只有前一个任务完成才能执行下一个任务;

异步任务是不在主线程上执行,而是进入任务队列,一些诸如ajax请求、settimeout的任务会由webaPIS执行返回其回调函数载队列中排队;

当主线程任务执行完毕后,任务队列开始通知主线程,请求执行任务,该任务按顺序进入主线程执行;

具体来讲:

\

\

  • 4、promise使用及实现、promise的并行执行和顺序执行

是什么?

编写异步代码的一种方式;

怎么用?

构造实例:

通过Promise构造函数,创建promise实例;

构造函数接受一个函数作为参数,并且在实例化时立即执行;

作为参数的函数接受两个回调函数作为参数,resolve和reject

在参数函数执行过程中,如果内部调用了resolve回调,那么实例状态变成fulfiled;如果参数函数内部执行reject()回调函数,那么实例状态变成rejected;

调用.then(arg1,arg2):

.then可以为promise实例注册fulfied和reajected两个状态下的回调函数

状态为前者,执行第一个函数;

状态为后者,执行第二个函数;

用法总结:

构造promise实例,通过.then.then调用的方式就是promise

有什么用?

避免多个一步任务产生的回调地狱,编写成本高;

支持一步任务串行和异步任务并行;

异步任务串行:每个方法都返回promise对象的函数,串行.then

异步任务并行:有了多个异步任务后,下面假设想要多个异步任务并行执行,都执行成功后,才处理结果。用回调方式来写,可采用下面的办法:

\

\

\

  • 5、javascript的数据类型、数据检查、深浅拷贝

基本类型、引用类型(按什么访问,存在哪里,动态加属性方法;操作符区分typeof instate Object.prototype.tostring.call();复制的区别;函数参数传递区别【实参给形参】)

数据检查:typeof instanceof Object.prototype.tostring.call()

\

深浅拷贝只针对引用类型

浅拷贝:简单理解是对最外一层属性的拷贝,如果属性中有对象,那么拷贝新对象与前者的属性是一个堆内存地址,修改会相互有影响; 函数实现:for in遍历传入对象,给{}赋值返回

深拷贝:复制对象的时候完全拷贝一个新对象,就算有属性是对象,也想互不影响,深拷贝的对象属性修改改变的事自己,不改变原来的;  函数实现:Json。parse(Json.stringfy)

\

例子:

数组浅拷贝:

\

深拷贝:

\

\

  • 6、js精度丢失是什么造成的

js存储Number类型使用的是双精度浮点存储;

计算过程:十进制转二进制科学技术计数法,有效数字位数64位,末尾0舍1入,转成二进制计算后,再转成十进制,多层计算,中间就造成了误差,也是丢失精度根本原因

\

  • 7、null和undefined的差异

简单理解:

undefined声明变量,未初始化;null刻意指定其值,未指向内存中任何变量;

表现形式:

类型区分:

typeof undefined = ‘undefied’ typeof null = ‘object’

Oject.prototype.todtring.call()直接区分

运算区分:

Number(undefies) = NaN Number(null) = 0

JSON对象属性值endefied过滤

\

\

  • 8、数组去重

思路:

\

\

  • map和set的区别

Map:

类似js对象

无限制的key:和普通对象相比,无限制的key,普通对象key只能string和sybol类型,它可以是任意类型作为key

循环 foreach 大小 m.size

\

Set:

数学里的集合{}

可以持续加入数据,返回对象本身,因此能链式调用,并且过滤重复数据

循环 for of 大小s.size 作用:数组去重 […new set(arr)]

  • 9、深拷贝和浅拷贝的区别?怎么实现浅拷贝?怎么实现深拷贝?

针对引用类型:

浅:最外层拷贝,对象属性存储指针,修改有影响;实现:遍历。常用例子:数组concat\slice&push

深:拷贝新的对象,互相隔离独立,修改无影响;实现:JSON>PARSE(JSON.STRINGFY) 原理:对字符串基本类型的转换切断了dui内存关系,新对象了

  • 10、暂时死区、变量提升、let, var, const 区别
  • 11、自执行函数

(function(){})(参数)

第一半返回方法,后边的是执行

  • 12、ES6箭头函数this指向

\

\

  • 13、原型链
  • 14、call, apply, bind
  • 15、new实现

\

\

\

  • 16、防抖节流
  • 17、垃圾回收和内存泄漏
  • 18、数组方法、数组乱序, 数组扁平化

创建数组: new Array()        []

\

\

\

\

\

\

\

\

\

\

  • 19、js数据类型有哪些?哪些是基本数据类型哪些是引用数据类型?

基本5种:

特点:

按值访问、不能添加属性和方法,在占内存中存储(标示符和值)

引用:对象类型

特点:按引用访问、能够动态添加方法和属性、由zhan和dui内存共同存储,战存储表示和指向对内存地址的引用(指针),对内存存值

区别:

复制 区别: 基本类型站中创建副本,且互不影响;引用的副本,存的地址 是一个,修改液,另一个会受影响

参数传递 区别

\

Typeof操作符判断基本类型,除了null,是Object。不能区分对象类型,都市Object。除了function

instanceof 判断对象是什么类型

最好的判断数据类型的方法

object. prototype .toString.call()

\

  • 20、js事件循环和任务队列

\

\

\

  • 21、事件委托

不在dom元素本身上监听事件,而是在其父元素上监听事件,通过事件冒泡,判断作用的target判断是哪个子元素触发的做判断,好处是动态子元素也可以有事件的绑定,如ul li

  • 22、定时器
  • 跨域?XSS、CSFR?

同源策略:

浏览器有同源策略用于防治XSS,CSFR等攻击,同源策略是指浏览器访问的协议、域名、端口都相同,一旦不相同就会发生跨于,这种情况下,禁止ajax请求、cookie读取等

解决方案:

jsop:

利用《script》标签,src属性无跨域特性,将请求参数通过src url传递,同时加一个query位callback的参数,。服务端接收后将结果哦返回到callback中,前端callback解析该数据即可

跨域资源共享:

需要浏览器和服务器通过xmlgttprequest属性配置共同支持

分为简单请求和非简单请求

简单请求:

浏览器request配置origin表示来自什么源,服务器响应配置Access-controle-allow-origin:*或者request origin  ;是否发送cookie;是否发送其他header

非简单请求:

多预检,请求头上有三个字段:origin,允许的方法,header其他值

其他一样

  • js异步加载

Js script标签正常放在中,由于浏览器是遇到标签草开始解析并渲染dom,因此放在head中会导致对于用户来讲,js会有一段时间的空白

解决方法:or

Defer:加载与dom渲染并行执行(异步)但不执行,等dom渲染完才执行

async:加载与执行js 和 dom渲染并行执行(异步)

共同点:

都不阻塞文档加载;脚本内都不能有document.wite()方法

动态加载:

window.onload(

doSomething()

)

\

  • 引用计数

值有引用,引用数+1,改变了引用,不引用他了,引用书-1,直到引用书=0,会清楚内存

\

  • 重绘和重排

重会:是盒子的位置、大小、颜色等外观属性发生变化后,浏览器的重新渲染

重排:DOM渲染树一枝/一部分发生隐藏、布局、结构变化导致的,浏览器会让这部分受影响的所有元素失效,重新构建这部分渲染树,完成重拍后,再将受影响的的部分重新绘制在屏幕上

\

关系:每个页面都至少一重排(回流)就是页面首次加载时候;重排一定重回

\

  • 按需加载

触发了相应动作才    加载    相应功能,这些加载的文件可能是图片、js文件、css文件等

  • 虚拟DOM

用js对象结构表示DOM结构

通过对象结构构建真正的DOM树,渲染在页面上;

当DOM发生变更的时候。构建一个新对象结构,并与旧DOM做比较,将变更反映到DOM树上

\

\

  • 浏览器缓存
  • 进程和线程,进程通信,管道

\

  • 防抖节流
  • H5性能优化
  • 移动端适配
  • 兼容性问题(样式、快速点击、桥调用)
  • vue与react区别,与jquery相比的优劣,为什么选?vue响应式?
  • Vue生命周期?响应式?
  • V-if,v-show,v-for优先级

\

  • 计算机网络协议模型,

物理层、链路层、网络层[IP]、传输层[tcp]、应用层【http】

  • tcp/udp区别
  • http1.0,1.1,2.0区别
  • https和http区别
  • !!!!常用状态状态码
  • 三次握手

C 发起请求链接S

S确认,也发起链接C

C确认

第一次握手:S只可以确认自己接受C发送的报文

第二次握手:C确认收到了S发送的报文,且可以确认自己接受S发送的报文

第三次握手:S确认C收到了自己发送的报文段

\

  • 浏览器缓存

\

\

\

\

juejin.cn/post/684490…

\

\