js相关面试题

js篇

一、作用域和*变量

变量作用域:就是一个变量可以使用的范围。

作用域种类:
  • 全局作用域
  • 函数作用域
  • 块级作用域

js中首先有一个最外层的作用域,全局作用域

js中可以通过函数来创建一个独立的作用域称为函数作用域,函数可以嵌套,所以作用域也可以嵌套‘;

es6中新增了块级作用域(大括号,比如:if{}, for() {} ,while() {}…);

*变量:

*变量的概念:当前作用域没有定义的变量

一个变量在当前作用域没有定义,但被使用了

向上级作用域,一层一层依次寻找,知道找到为止

如果到全局作用域都没有找到,则报错 xx is not defined

js相关面试题

作用域链:

*变量的向上级作用域一层一层的查找,知道找到为止,最高找到全局作用域,就形成了作用域链。

二、this的指向问题

5大调用场景:

  • 普通函数中调用,this指向window
  • 对象方法中调用,this指向当前对象
  • call apply bind中调用, this指向被传入的对象
  • class中的方法中调用, this指向实例对象
  • 箭头函数,this就是父级上下文中的this

注意:

this取什么值,是在执行时确认的,定义时无法确认

三、闭包

闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数. 可以理解为 (能够读取其他函数内部变量的函数)

**闭包的作用:**闭包的作用: 正常函数执行完毕后, 里面声明的变量被垃圾回收处理掉, 但是闭包可以让作用域里的 变量, 在函数执行完之后依旧保持没有被垃圾回收处理掉

闭包的应用场景:

  1. 函数作为参数被传递

  2. 函数作为返回值被传递

  3. 实际应用(隐藏数据):为什么说隐藏数据了呢,因为普通用户只能通过get、set等api对数据进行查看和更改等操作,没法对data更改,达到所谓隐藏数据的效果;jquery就利用了这一特性,必须调用$.ajax()才能访问内部属性方法。封装功能时(需要使用私有方法),
    函数防抖、函数节流
    单例模式

闭包的优点:

  1. 变量长期驻扎在内存中
  2. 另一个就是可以重复使用变量,并且不会造成变量污染

四、数据类型判断

  1. typeof typeof 判断基本数据类型,但是遇到引用数据类型(如:Array)就不起作用
    2.instanceof 判断 new 关键字创建的引用数据类型
    不考虑 null 和 undefined(这两个比较特殊)以对象字面量创建的基本数据类型

  2. constructor constructor 可以应对基本数据类型和引用数据类型 但如果声明了一个构造函数,并且把他的原型指向了 Array 的原型,这种情况下,constructor 也不起作用

  3. Object.prototype.toString.call() 完美的解决方案

五、原型和原型链

1、原型的概念
JavaScript的象中都包含了一个 [proto] 内部属性,这个属性所对应的就是自身的原型

2、原型链的概念
当一个对象调用自身不存在的属性/方法时,就会去自己 [proto] 关联的前辈 prototype 对象上去找,如果没找到,就会去该 prototype 原型 [proto] 关联的前辈 prototype 去找。依次类推,直到找到属性/方法或 undefined 为止。从而形成了所谓的“原型链”。

六、==与===

===三等表示全等,判断左右两边对象或值是否类型相同值相等
==二等表示值相等。判断操作符两边对象或值是否相等类型可以不同

七、事件委托

事件委托,又名事件代理。事件委托就是利用事件冒泡,就是把子元素的事件都绑定到父元素上。如果子元素阻止了事件冒泡,那么委托也就没法实现了。

八、深拷贝、浅拷贝

  • 深拷贝 :复制基本类型的属性与原来的对象是完全隔离的,互不影响, 对一个对象的修改并不会影响另一个对象。

  • 浅拷贝:当对象的属性值是引用类型时,实质复制的是其引用,引用指向的值改变时也会跟着变化。

  • 可 以 使 用 JSON.stringify() 、 JSON.parse() for in 、 Object.assign 、 扩 展 运 算 符 … 、实现深拷贝

九、 事件冒泡,事件捕获

  • 什么是事件?

    事件是文档和浏览器窗口中发生的特定的交互瞬间。

  • 什么是事件流?

    事件流描述的是从页面中接受事件的顺序

    • 冒泡事件:微软提出的 事件由子元素传递到父元素的过程,叫做事件冒泡

    • 捕获事件:网景提出的 事件由父元素到子元素传递的过程,叫做事件捕获

十、 async/await

Async 和 await 是一种同步的写法,但还是异步的操作,两个内容还是必须同时去写才会生效,await 有一个不错的作用就是可以等到你的数据加载过来以后才会去运行下边的 js 内容,而且 await 接收的对象必须还是个 promise 对象,如果是接收数据的时候就可以直接用一句话来接收数据值,所以 async await 主要应用是在数据的接收,和异步问题的处理

十一、什么是回调地狱

十二、防抖节流

应用场景主要是用户频繁操作后,通过定时请求。可以减少服务器的请求次数。
定义:
函数防抖: 是指在事件被触发 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时。

函数节流: 是指规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。

十三、 promise 是什么?有哪些状态和参数?如何使用?

promise对象本质上其实是一个构造函数,就是用来解决异步编程的一种解决方案

promise 有三个状态:
pending 是 初始状态
fulfilled 是 操作成功的状态
rejected 是 操作失败的状态

Promise 对象的状态改变,只有两种可能:

1、从pending变为fulfilled, 就是将promise对象的状态从初始状态变为了成功状态,也就是异步操作成功时会调用,将异步操作的结果作为参数传递出去

2、还有一种可能就是
从pending变为rejected,就是将promise对象的状态从初始状态变为了失败状态0也就是异步操作失败时会调用,将异步操作爆出的错误作为参数传递出去

最后我们通过new关键字实例化promise,而实例化之后的promise对象的参数是一个回调函数,回调函数有两个参数,分别为成功回调resolve和失败回调reject,
通过原型上then()方法来接收成功之后的数据
通过原型上的catch()方法来接收失败之后的数据
这就是promise的一个基本时候用