1.深拷贝与浅拷贝的区别?

1.浅拷贝只复制属性指向某个对象的指针,而不是复制对象本身,新旧对象还是共享一块内存,修改对象属性会影响原对象

在JS中,Object.assign ,Array.prototype.slice(), Array.prototype.concat() 拓展运算符

2.深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象

JSON.stringify() _.cloneDeep()

2.事件与事件流

事件流都会经历三个阶段

  • 事件捕获阶段(capture phase)

    事件捕获阶段:事件从 document一直向下传播到目标元素,依次检查经过的节点是否绑定了事件监听函数,如果有则执行

  • 处于目标阶段(target phase)

    事件处理阶段:事件到达目标元素,触发目标元素的监听函数

  • 事件冒泡阶段(bubbling phase)

    事件冒泡阶段:事件从目标元素冒泡的document,依次检查经过的节点是否绑定了事件监听函数数,如果有则执行

事件绑定监听函数如下:

addEventListener(eventType,handler)

3.typeof 与 instanceof 的区别

typeof 会返回一个变量的基本类型,instanceof 返回的是一个布尔值

instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型

4. new 操作符具体干了什么了?

  1. 创建了一个新的对象 obj
  2. 将对象与构造函数通过原型链连接起立 让 this 指向这个新的对象给这个新的对象添加属性和方法
  3. 返回这个新的对象

5.为什么JavaScript里面0.1+0.2 === 0.3是false

问题的根源是十进制小数转为二进制小数的过程中,会损失精度

浮点数计算有问题,整数计算是没问题的,那么将浮点转化成整数运算,之后再切回浮点就可以保证没有偏差了

6. null 和 undefined的 区别 是什么

答:这个问题就有历史问题,设计之处都是设计nul l作者在设计js之处借鉴java的语言 但是null会被隐式转化为0,不容易发现错误

后面出来的undefined的填补之前的坑

具体区别:null是一个表示 “无” 的对象(空对象指针)转化数值为0 undefined是一个表示 “无” 的原始值,转化数值为Nan

6.bind、call、apply 的区别?

callapplybind作用是改变函数运行时的this指向

如果第一个参数为null或者undefined,则this的指向默认为window

apply: 有两个参数,第一个是this的指向,第二个是函数接收的参数,(以数组的形式),

call:有两个参数,第一个也是this的指向,第二个则为参数列表

applycall改变 this 指向原函数立即执行。临时改变this指向一次

bind :两个参数,第一个参数tihs的指向,第二个参数列表 改变this指向不会立即执行而是返回一个永久改变this指向的函数

7.正则表达式的理解?

正则表达是一种用来匹配字符串的强有力的武器它的设计思想是用一种描述性的语言定义一个规则,凡是符合则匹配

8.事件循环

JavaScript中,所有的任务都可以分为

  • 同步任务:立即执行的任务,同步任务一般会直接进入到主线程中执行
  • 异步任务:异步执行的任务,比如ajax网络请求,setTimeout定时函数等

异步任务(事件循环)还可以细分为微任务宏任务

微任务:

  • Promise.then
  • MutaionObserver
  • Object.observe(已废弃;Proxy 对象替代)
  • process.nextTick(Node.js)

宏任务:

  • script (可以理解为外层同步代码)
  • setTimeout/setInterval
  • UI rendering/UI事件
  • postMessage、MessageChannel
  • setImmediate、I/O(Node.js)

执行流程:同步 ==》事件循环【微任务和宏任务】 ==》微任务 ==》 宏任务 ==> 微任务

注:要执行宏任务的前提是清空了所有的微任务!

asyncawait 是什么? 它们有哪些作用? 主要是简化promise 操作

async await es7 里面的新语法 它的作用是

async 用于申明一个function是异步的,

await 用于等待一个异步方法执行完成,它可以很好的代替promise里的then

async 函数返回的是一个promise对象,可以使用then的方法添加回调函数,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体后面的语句

什么是递归,有哪些优缺点?

递归:如果一个函数在内部可以调用其本身,那就是递归

简单理解:函数内部自己调用自己

  • 优点:结构清晰,可读性强

  • 缺点: 效率低,调用栈可能会溢出

POST 和 GET 请求有哪些区别

1.应用场景:post用来修改数据,get用来请求数据的

2.缓存方面:在不同的场景,get用来请求数据,所有浏览器一般会对get请求缓存,post会很

3.传递参数的方式:get采用明文传输,将请求的参数放入url向服务器发送,而post的请求参数放在请求体当中

4.安全性方面:正由于传输方式不同,导致get请求的明文存在安全隐患,而post将参数存在body中是相对安全的

箭头函数与哪些特征?请简单描述一下

  1. 箭头函数没有自己的 this ,this指向箭头函数所处的上下文环境
  2. 箭头函数无法使用 call apply bind 改变this指向
  3. 箭头函数也算是是匿名函数,不能使用new关键词
  4. 箭头函数没有 prototype
  5. 箭头函数不能绑定 arguments,