JS面试题总结(第二弹)

1什么是原型链?作用是啥?

每个对象都有一个原型对象与之关联,这个原型对象也是一个普通对象,这个普通对象也有自己的原型对象,这样层层递进,就形成了一个链条,就是原型链。通过原型链可以实现JS继承,把父类的原型对象赋值给子类的原型,子类的实例对象就可以访问父类原型上的属性和方法

2什么是原型?什么是原型对象?

原型指的是两个原型属性,显示原型属性prototype和隐式原型属性__proto__。所有的对象都有隐式原型属性,指向其构造函数显示原型属性的值。除了箭头函数,所有的函数都有显示原型属性,它的值叫原型对象,默认有两个属性,constructor和__proto__。constructor指向函数本身。

3什么是AJAX,作用是什么?

AJAX是前后端交互的一种方式,是一种异步交互技术,前端与服务器进行少量数据交换,可以在不加载整个网页的情况下实现局部网页更新。AJAX主要围绕着发请求和接响应,遵循http协议,满足get和post,使用AJAX可以使用户获得更好的体验,降低网络流量、提升网络使用效率、网页响应更快、用户操作的和服务器通信同步进行等

4同步和异步是什么?

1.js是单线程语言,没有多线程的概念,同一时间只能执行一个任务,为了应对同一时间出现多个任务,就引入了同步和异步的技术,将代码分为同步代码和异步代码。
2.同步是指按照顺序执行代码。js代码在执行的过程中按照顺序按部就班地执行,且必须等上一个代码执行完后才执行下一个代码。
3.异步是指跳过异步代码执行后续的同步代码。js代码在执行的过程中如果遇到需要消耗等待时间的代码就自动跳过,执行后续的同步代码,当所有同步代码执行完后,再执行异步代码。

5什么是事件轮循机制?

本质上是研究js编辑器是如何编译的,同一时间只能编译一个代码段,同步代码和异步代码最终都要经过主线程,主线程的容器分为执行栈和任务队列。执行栈存储同步代码,任务队列存储异步代码,同步代码优先执行,等所有同步代码执行完后再将最先结束等待时间的异步代码拖入主线程,如果异步代码里面有微任务的话,优先执行微任务,最后执行宏任务。

6常见的异步代码有什么?

定时器回调函数,事件体,发请求接响应,promise的回调函数里面的代码

7Vue是如何实现双向绑定原理的?

Vue的底层绑定原理都是一样的,无论是Vue2还是Vue3要实现数据驱动都需要一个代理的方法。Vue2使用的是Object.defineProperty + 观察者、发布者模式;Vue3使用的是proxy + 观察者、发布者模式。

8什么是proxy?作用是什么?

proxy是对象操作拦截器,可以给被代理的对象添加方法,赋予该对象属性的某些功能,最重要的是实现数据驱动

9Proxy和Object.defineProperty的区别是什么? (为什么要用Proxy代替Object.defineProperty?)

1.Proxy是一个对象,Object.defineProperty一个方法
2.Proxy可以给被代理对象的所有属性添加方法,Object.defineProperty每个属性都需要单独写
3.Proxy有深度遍历的能力,Object.defineProperty则没有
4.在赋值和读写的过程中,二者在参数上有区别

10什么是hasOwnProperty?

hasOwnProperty是对象的一个方法,返回布尔值,可以判断一个对象的成员属性是自己的还是原型上的,是自己的属性返回true,是原型上的属性返回false

11URL的组成部分有什么?

IP地址+端口号+文件路径+路由参数+请求参数

12http的get和post有什么区别?ajax的get和post有什么区别?

http:
get请求将请求数据作为url的一部分发送,安全性低、效率高、传输量小、易用性好
post请求安全性高、效率低、传输量大
ajax:
get请求需要将请求参数以键值对的形式携带在url上
post请求需要把请求参数写在请求体里面(send()),请求信息里面只写url,在请求信息和发送请求之间设置设置请求头,意思是将参数以form表单得形式发送

13常见得http协议响应码

200 服务器准备就绪
404 输入了错误的url或请求资源不存在
403 服务器收到了请求但拒绝提供服务
500 服务器出现错误

14什么是web服务器?

web服务器实现了外网通过url规则访问服务器的部署目录,将开发目录放在部署目录里面可以被外网访问

15ajax的属性和方法有哪些?

1.XMLHttpRequest是ajax的核心类
2.open() 配置请求信息的 有访问姿势、URL、是否异步
3.send() 发送请求的
4.status HTTP协议的状态码
5.readyState 在发请求和接响应的过程中ajax的核心类的实例对象的状态码
6.responseText 接收到的响应
7.setrequestHeader POST请求的请求头
8.onreadyStatechange 每次对象状态码发生改变所触发事件的事件处理函数

16说说你对 JavaScript 的作用域的理解。什么是作用域链?

作用域决定了变量的可访问性。分为全局作用域和局部作用域,全局作用域在整个html文档里面,局部作用域在函数体里面,全局作用域只有一个,局部作用域理论上可有无数个。当查找变量时,会先在自己的执行上下文的变量对象上找,如果没有,就在父级的上下文查找,一直找到全局,这样由多个执行上下文的变量对象构成的链表就是作用域链。

17let、const和var的异同

三者都是用来定义变量的关键字
var 有声明提升、没有块级作用域,可重复定义相同的变量
let 和 const 没有声明提升、有块级作用域、暂时性死区、必须先定义后使用、在同一个作用域下无法声明相同的变量,let可以重新赋值,const常用于修饰只读变量,一经声明必须赋值,赋值后无法修改,习惯上变量名大写

18说说你对执行上下文的理解

执行上下文有三个,全局执行上下文、函数执行上下文和执行栈
全局执行上下文只有一个,就是window,可以在全局作用域中通过this访问到它
函数执行上下文可以有无数个,一个函数被调用时可以产生一个函数执行上下文,多次调用同一个函数产生的函数执行上下文也是不同的
执行栈可以理解为是一个容器,它保存了js代码在执行时产生的所有上下文,具有先进后出的特点,js代码首次执行时,先创建一个全局执行上下文并压入到执行栈中,后每当一个函数被调用时都会产生函数执行上下文并压入到执行栈中,根据执行栈的特点,js代码在执行完毕的前一刻永远都有一个全局执行上下文

19ES5/ES6的继承除了写法不同以外还有什么不同?

1.
ES5先创建子类的实例,再将父类的方法添加到this上
ES6先创建父类的实例,再用子类的构造函数修改this
2.
ES5通过原型或构造函数机制实现继承
ES6通过class关键字定义类,里面有构造方法,类之间通过extends实现继承。继承时子类必须在constructor方法中调用super方法,否则新建实例会报错,因为子类没有自己的this对象,而是继承了父类的this对象,然后对其加工,super指代父类的实例,即父类的this对象,如果不调用super方法,子类得不到this对象

20简述Node.js 的运行机制

V8引擎解析js代码,解析后的代码调用node API,libuv库负责node API的执行,将不同的任务分配给不同的线程,形成事件循环,以异步的方式将任务执行的结果返回给V8引擎,V8引擎将结果反馈给用户

21什么是发布订阅模式?

当一个任务执行完成后,会发布一个事件,当这个事件有一个或多个“订阅者”的时候,会接收到这个事件的发布,执行相应的任务,这种模式叫发布订阅模式

22什么是promise?

promise是ES6提出的解决回调地狱的解决方案,主要围绕着接响应。promise对象的状态有三个,分别是pending,succeed,failed。promise对象的状态只能从pending变成succeed或failed,且只有异步操作的结果才能改变promise的状态。promise将回调地狱的写法改为了链式调用,将异步操作以同步操作的流程表达了出来。promise无法取消,还要设置回调函数,否则内部抛出的错误无法反应到外部,当处于pending状态时,无法得知具体处理进度,是刚开始还是快结束了,当执行多个Promise时,一堆then看起来也很不友好

23async 和 await 、promise的异同

两者都是为了解决回调地狱提出的解决方案
async 和 await是解决回调地狱的终极解决方案,遵循的是Generator函数的语法糖,它拥有内置执行器,不需要额外调用可以自动执行并输出结果,返回promise对象。await本质上提供了异步等待机制,将异步代码变成了同步代码

24什么是反柯里化?

在JS中,当我们调用对象的某个方法时,其实不用去关心该对象原本是否被设计为拥有这个方法,这是动态类型语言的特点,通过反柯里化函数实现,让一个对象去借用一个原本不属于他的方法

25面向对象编程与面向过程编程的区别?

面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
​
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。

26promise的all和race的应用场景

all:保证所有请求发送完后统一接收响应
race:竞速,同时向不同的服务器发送相同的请求,使用返回最快的响应,提高效率

27介绍一下 ES6 中 Set, Map的区别?

Map对象是键值对的合集,和JSON对象类似,但key不仅仅局限于字符串,可以是各种类型的数据包括对象都可以作为Map的key
Set对象类似于数组,且成员的值都是唯一的,相同的键会被自动过滤,不存储value

28你能说说 prototype 与 proto 的区别吗?

1.所有的对象都有__proto__属性,指向其构造函数的原型对象(prototype)
2.除了箭头函数,所有的函数既有__proto__属性也有prototype属性,prototype指向其原型对象

29简述src和href的区别

src表示引用资源,指向外部资源的位置,请求src资源时会将其指向的资源下载并应用到当前文档中,src可以跨域访问
href表示超文本引用,用来建立当前元素和文档之间的链接,常用于link和a上

30为什么操作DOM慢?

DOM对象本身也是JS对象,严格来说并不是操作DOM慢,而是操作DOM后需要经过跨流程通信和渲染线程触发的重新渲染,导致DOM操作慢;JS引擎和渲染引擎的模块化设计,使得它们可以独立优化,运行速度更快,但这种设计带来的后果就是DOM操作越来越慢

31异步的解决方案有哪些?

1.回调地狱
2.promise的链式调用
3.async await
4.Generator
5.事件发布订阅

32事件委托和事件监听的好处有什么?

事件委托:
将子元素要实现的功能委托给其父元素实现,降低代码量,提高程序运行效率,可以给未创建的元素提前绑定事件
事件监听:
可以给相同的元素多次绑定相同事件,可以决定事件流的传递是捕获还是冒泡

32什么是事件流?

事件的动作是可以传播的,就像水流一样,在传播的过程中分为两种,一种是子级为传播源,由内向外传播,这种传播方式叫冒泡;第二种是由父级依次向子级传播,由外到里,这种传播方式叫捕获。

33构造函数和普通函数的区别是什么?

构造函数不能有return关键字,构造函数的return是默认的,return的是当前 new 出来空间的地址
构造函数必须和 new 关键字连用 ,表示创建了一个对象
构造函数名的首字母必须大写
new 的作用是在堆内存中开辟了该类型对象的存储空间

34for in 和 for off的区别?

for in 通常特指用来遍历JSON对象
for off 专门遍历没有下标的容器,不能遍历JSON,可以遍历数组

35常见的内存泄漏有哪些?

1.闭包
2.被遗忘的定时器和回调函数
3.未及时清理的DOM元素引用
4.不用 var 声明的全局变量,相当于挂载到 window 对象上

36谈谈垃圾回收机制

JS在创建对象时会自动分配内存,对于不再使用的对象会自动释放内存,这一过程被称为垃圾回收。垃圾回收的方式有二,一是标记清除,当变量进入环境时标记为“进入环境”,当离开环境时会标记为“离开环境”,离开环境的变量就回收内存。二是记录引用次数,跟着记录每个值被引用的次数,一旦没有引用,就直接释放内存

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值