Node.js 面试题

1.Node.js更适合什么项目中的应用,也就是简单说说其应用场景?

1)、实时应用:如在线聊天,实时通知推送等等(如socket.io
2)、分布式应用:通过高效的并行I/O使用已有的数据
3)、工具类应用:海量的工具,小到前端压缩部署(如grunt),大到桌面图形界面应用程序
4)、游戏类应用:游戏领域对实时和并发有很高的要求(如网易的pomelo框架)
5)、利用稳定接口提升Web渲染能力
6)、前后端编程语言环境统一:前端开发人员可以非常快速地切入到服务器端的开发(如著名的纯Javascript全栈式MEAN架构)

2.你了解Node.js的内存泄漏吗?

回调函数没有执行完毕,一直留在人物队列的时候,就形成闭包,内部的数据就一直占有内存。如果数据多了,会产生内存泄漏!

这里有工具可以检测。内存泄露定位工具。

3.js类继承的方法有哪些

继承第一种方式:对象冒充

继承第二种方式:call()方法方式

继承的第三种方式:apply()方法方式

继承的第四种方式:原型链方式,

继承的第五种方式:混合方式

4.js类多重继承的实现方法是怎么样的?

参考答案:就是类继承里边的属性复制法来实现.因为当所有父类的prototype属性被复制后,子类自然拥有类似行为和属性.

5.js里的作用域是什么样子的?

参考答案:大多数语言里边都是块作作用域,以{}进行限定,js里边不是.js里边叫函数作用域,就是一个变量在全函数里有效.比如有个变量p1在函数最后一行定义,第一行也有效,但是值是undefined.

6.apply, call和bind有什么区别?

 

参考答案:三者都可以把一个函数应用到其他对象上,注意不是自身对象.apply,call是直接执行函数调用,bind是绑定,执行需要再次调用.applycall的区别是apply接受数组作为参数,而call是接受逗号分隔的无限多个参数列表,

7.node的构架是什么样子的?


参考答案: 主要分为三层,应用app >> V8及node内置架构 >> 操作系统. V8是node运行的环境,可以理解为node虚拟机.node内置架构又可分为三层: 核心模块(javascript实现) >> c++绑定 >> libuv + CAes + http.

8.node有哪些核心模块?


参考答案: EventEmitter, Stream, FS, Net和全局对象

9.node有哪些全局对象?


参考答案: process, console, Buffer和exports

10.process有哪些常用方法?


参考答案: process.stdin, process.stdout, process.stderr, process.on, process.env, process.argv, process.arch, process.platform, process.exit

11.console有哪些常用方法?


参考答案: console.log/console.info, console.error/console.warning, console.time/console.timeEnd, console.trace, console.table

12.node有哪些定时功能?


参考答案: setTimeout/clearTimeout, setInterval/clearInterval, setImmediate/clearImmediate, process.nextTick

13.node中的事件循环是什么样子的?


参考答案: event loop其实就是一个事件队列,先加入先执行,执行完一次队列,再次循环遍历看有没有新事件加入队列.但是请务必注意,这一个事件队列的循环,一次只执行一个事件,然后下一次循环再执行一个事件.这是由于javascript的单线程机制导致的,如果一次循环多个事件,就可能会阻塞其它代码的执行.异步执行的叫IO events, setImmediate是在当前队列立即执行,setTimout/setInterval是把执行定时到到后面的队列,process.nextTick是在当前执行完,下次遍历前执行.所以总体顺序是: IO events >> setImmediate >> setTimeout/setInterval(注册事件) >> process.nextTick.

14.node中的Buffer如何应用?


参考答案: Buffer是用来处理二进制数据的,比如图片,mp3,数据库文件等.Buffer支持各种编码解码,二进制字符串互转.

15.什么是EventEmitter?


参考答案: EventEmitter是node中一个实现观察者模式的类,主要功能是监听和发射消息,用于处理多模块交互问题.

16.如何实现一个EventEmitter?


参考: 在nodejs中有一个EventEmitter类,目的是实现各种事件的event处理。当需要指定绑定事件时,可以使用EventEmitter类的on方法或addListener方法.这两个方法实现原理相同,只是名称不一样.这两个方法都有两个参数,第一个参数为指定事件名 第二个参数为该事件的事件处理函数:

17.EventEmitter有哪些典型应用?


参考: 1) 模块间传递消息 2) 回调函数内外传递消息 3) 处理流数据,因为流是在EventEmitter基础上实现的. 4) 观察者模式发射触发机制相关应用

18.怎么捕获EventEmitter的错误事件?

 参考: 监听error事件即可.如果有多个EventEmitter,也可以用domain来统一处理错误事件.

 

19.EventEmitter中的newListenser事件有什么用处?

参考:newListener可以用来做事件机制的反射,特殊应用,事件管理等.当任何on事件添加到EventEmitter时,就会触发newListener事件,基于这种模式,我们可以做很多自定义处理.

 

20.内置的fs模块架构是什么样子的?


参考:fs模块主要由下面几部分组成: 1) POSIX文件Wrapper,对应于操作系统的原生文件操作 2) 文件流 fs.createReadStream和fs.createWriteStream 3) 同步文件读写,fs.readFileSync和fs.writeFileSync 4) 异步文件读写, fs.readFile和fs.writeFile

21.读写一个文件有多少种方法?


参考答案: 总体来说有四种: 1) POSIX式低层读写 2) 流式读写 3) 同步文件读写 4) 异步文件读写

22.怎么读取json配置文件?


参考:主要有两种方式,第一种是利用node内置的require('data.json')机制,直接得到js对象; 第二种是读入文件入内容,然后用JSON.parse(content)转换成js对象.二者的区别是require机制情况下,如果多个模块都加载了同一个json文件,那么其中一个改变了js对象,其它跟着改变,这是由node模块的缓存机制造成的,只有一个js模块对象; 第二种方式则可以随意改变加载后的js变量,而且各模块互不影响,因为他们都是独立的,是多个js对象.

23.node的网络模块架构是什么样子的?


参考: node全面支持各种网络服务器和客户端,包括tcp, http/https, tcp, udp, dns, tls/ssl等.

24.node是怎样支持https,tls的?


参考: 主要实现以下几个步骤即可: 1) openssl生成公钥私钥 2) 服务器或客户端使用https替代http 3) 服务器或客户端加载公钥私钥证书

25.node中的异步和同步怎么理解


参考答案: node是单线程的,异步是通过一次次的循环事件队列来实现的.同步则是说阻塞式的IO,这在高并发环境会是一个很大的性能问题,所以同步一般只在基础框架的启动时使用,用来加载配置文件,初始化程序什么的.

26.有哪些方法可以进行异步流程的控制?


参考答案: 1) 多层嵌套回调 2) 为每一个回调写单独的函数,函数里边再回调 3) 用第三方框架比方async, q, promise等


27.怎样绑定node程序到80端口?


参考答案: 多种方式 1) sudo 2) apache/nginx代理 3) 用操作系统的firewall iptables进行端口重定向

28.有哪些方法可以让node程序遇到错误后自动重启?


参考答案: 1) runit 2) forever 3) nohup npm start &

29.程序总是崩溃,怎样找出问题在哪里?


参考答案: 1) node --prof 查看哪些函数调用次数多 2) memwatch和heapdump获得内存快照进行对比,查找内存溢出

30.有哪些常用方法可以防止程序崩溃?


参考答案: 1) try-catch-finally 2) EventEmitter/Stream error事件处理 3) domain统一控制 4) jshint静态检查 5) jasmine/mocha进行单元测试












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值