【Node专题】收集Node面试题

387 阅读5分钟

收集了一波面试时可能会被提问的一些问题,也把回答结果呈现出来。后续不断更新题目和答案。 不知道分析的是否对错,欢迎大家来指正,提出建议。

JavaScript

问题:this是什么?

juejin.cn/post/696031…

问题:原型与原型链的理解

zhuanlan.zhihu.com/p/62903507

问题:typeof instanced of

  • typeof 返回字符串类型
  • typeof 一般只能返回如下几个结果:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"
  • instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
  • instanceof用于判断变量是否是某个对象的实例

问题:call、apply、bind的区别

三个都是绑定对象,用来重定义this对象,主要的区别是:

  1. call、apply绑定对象,而bind返回的是新的函数,必须调用它才能执行

  2. 参数call和bind的参数都是直接放进去,而apply参数是必须放在一个数组内才能传进去

  3. 这三个参数不限定类型

    var person = {name:"jasen",age:99,}function myFun(){
    	console.log(`name:${this.name},age:${this.age}`);
    }
    myFun.call(person);
    myFun.apply(person);
    myFun.bind(person)(); //多了个括号,返回的是新的函数,必须调用它才能执行
    //执行结果:
    name:jasen,age:99
    name:jasen,age:99
    name:jasen,age:99
    
    //传参数
    var person = {
        name:"jasen",
        age:99,
    }
    
    function myFun(frm ,w){
    	console.log(`name:${this.name},age:${this.age},来自${frm} 去往${w}`);
    }
    
    myFun.call(person,'北京','厦门');
    myFun.apply(person,['北京','厦门']);
    myFun.bind(person,'北京','厦门')();
    myFun.bind(person,['北京','厦门'])();
    
    //执行结果
    name:jasen,age:99,来自北京 去往厦门
    name:jasen,age:99,来自北京 去往厦门
    name:jasen,age:99,来自北京 去往厦门
    name:jasen,age:99,来自北京,厦门 去往undefined
    

EScript6

问题:ES6新特性你多了解多少?

  • 答:ES6特性有class、promise、async/await、箭头函数、generator

问题:promise中then第二个参数与catch的区别?三种状态是哪三种?

  • 考点:promise的理解
  • 答:三种状态:pending、resolve、reject 如果then的第一个函数抛出异常,则由then第二个函数5、class的用法

问题:解决回调地狱的方法有哪些?

  • 答:1、通过封装模块;2、使用promise;3、使用await\async

问题:generator

貌似基本都没有使用过

问题:ES6如何兼容ES3

问题:箭头函数和普通函数的区别?

  • 第一次回答:使用比较简便
  • 第二次回答:

Node

问题:谈谈你对事件循环的理解?

  • 答:我对事件循环的理解Node是单线程的,主线程将所有任务都放在循环队列中,然后由底层的libuv库从循环事件队列中取出任务分配给不同的线程去处理,主线程同时也会进行回调处理,整个过程形成事件循环

问题:事件队列中的任务你是怎么理解

  • 答:主线程将都任务都是放在事件队列中,任务都划分为微任务和宏任务,libuv库会优先取出微任务进行处理,都处理完后再取出宏任务进行处理
  • 微任务:promise.next();
  • 宏任务:

问题:node的原生模块你用过哪些?

  • 答:原生模块:有http,stream,buffer ,fs,path,child_process,cluster,v8,os,net等等
  • 需要都熟悉下,面试时说到哪些自然会进一步被询问一些原理

问题:Node模块中的Buffer 和Stream

  • 第一次答:平时的业务场景使用的比较少,但是大概知道stream是流,数据流,会在读取大文件,大数据量使用,类似分片读取,buffer 是缓冲区,经常和steam配合使用
  • 第二次答:stream是数据流,经常在读取大文件和大数据量通过使用stream读取,避免一次性读取数据量过大阻塞线程;buffer 是缓冲区,可以将数据转化成二进制再进行传输,可以解决大数据量通过字符串形式进行网络传输时性能影响。

问题:express 和koa框架的区别

  • 考点:express和koa的理解

  • 第一次答:koa使用比较少,express有比较多的成熟的中间件,koa比较简洁

  • 第二次答:都是node的服务端框架,这部分的框架都是基于中间件来实现的,主要的区别是中间件的执行方式。

    • express封装、内置了很多中间件,如connect、router,而koa比较轻量,可根据要求自己定制
    • express 是基于callback来处理中间件,koa是基于await/async
    • express 不是严格按照洋葱模型执行中间件,koa是严格按照洋葱模型执行中间件

问题:Node是单线程的吗?

是单线程的,主线程是单线程,底层的还是多线程的,比较说基于事件循环的实现就是多线程的,而且虽然说是单线程的但是也是可以支持多线程的

问题:Node的优势和劣势?

  • 优势:因为是单线程的,就无需考虑因多线程而产生的问题死锁问题,线程切换的问题,多线程共享的问题。
  • 劣势:因现在硬件条件都很好了,如果分配多核的服务器部署node应用程序,这样自然会造成资源的浪费。单线程也容易造成一旦有错误就会导致整个服务都退出。大量占cpu计算就容易线程阻塞