node面试知识

简介: node面试知识

01node和浏览器有什么区别和联系,及node进行服务端开发的本质

Node.js和浏览器在JavaScript运行环境方面存在一些区别和联系。


区别:


运行环境:Node.js是一个服务器端JavaScript运行环境,而浏览器是一个客户端JavaScript运行环境。

内置对象和this的指向:Node.js中全局对象为global,而浏览器中全局对象为window。在Node.js中,this默认指向空对象{},而在浏览器中,全局this默认指向window。

JS引擎:Node.js基于Chrome的V8引擎,对V8引擎进行了封装和优化,使其在非浏览器环境下运行得更好。而浏览器使用各自的JS引擎进行解析和执行,存在兼容性问题。

API和模块加载:Node.js中提供了很多浏览器中没有的API,如文件操作、网络请求等。此外,Node.js支持CommonJS模块标准,使用require()导入模块,而浏览器使用ES模块化标准,使用import方式导入模块。

联系:


都是JavaScript的运行环境:无论是Node.js还是浏览器,都是JavaScript的运行环境,都能解析和执行JavaScript代码。

ECMAScript语法通用:对于ECMAScript语法来说,在Node.js和浏览器中都能运行。

互补性:浏览器主要用于前端开发,提供DOM和BOM等API进行页面操作和用户交互;而Node.js主要用于后端开发,提供文件操作、网络请求等API进行服务器操作。两者可以相互配合,实现全栈开发。本质:

Node.js进行服务端开发的本质在于它是一个基于Google的V8引擎的JavaScript运行环境,专为非阻塞I/O模型设计。这使得Node.js在处理高并发请求时表现优异,能够轻松地处理大量并发连接。


具体来说,Node.js采用事件驱动和非阻塞I/O模型,这意味着它可以在单线程中处理多个请求,而不会像传统的多线程模型那样因为线程切换和锁定而消耗大量资源。这种模型非常适合处理大量并发连接,如Web服务器或实时聊天应用等。


此外,Node.js还提供了丰富的API和模块,使得开发者可以轻松地实现文件操作、网络请求、数据库连接等功能。这些功能在传统的服务器端开发中通常需要借助其他语言或框架才能实现,而Node.js则将它们集成到了JavaScript中,使得开发者可以使用同一种语言进行全栈开发。


总的来说,Node.js进行服务端开发的本质在于它利用JavaScript的轻量级和灵活性,结合事件驱动和非阻塞I/O模型,提供了一种高效、简单、易于扩展的服务器端开发方案。


02什么是文件系统,为什么node需要文件系统,fs有哪些常见的操作

文件系统是操作系统中负责管理和存储文件信息的软件机构,它定义了存储设备(如磁盘、固态硬盘等)或分区上的文件组织方式。文件系统的主要功能包括为用户建立文件、存储、读取、修改、转储文件,控制文件的存取,以及当文件不再使用时撤销文件等。


在Node.js中,文件系统(fs)模块是非常重要的,因为它允许Node.js与服务器上的文件系统进行交互。Node.js通过fs模块提供的API,可以对服务器上的文件进行创建、读取、写入、删除等操作。这对于构建如Web服务器、文件上传/下载服务、日志记录系统等应用是非常关键的。


fs模块提供了一系列常见的文件操作函数,以下是一些常见的操作:


fs.readFile(filename, [encoding], [callback(err, data)]):读取文件内容。参数包括文件名、文件编码(可选)以及回调函数。回调函数接收两个参数,一个是错误对象(如果有错误发生),另一个是文件内容。

fs.writeFile(filename, data, [options], [callback(err)]):写入文件内容。参数包括文件名、要写入的数据、写入选项(可选)以及回调函数。回调函数接收一个错误对象(如果有错误发生)。

fs.appendFile(filename, data, [options], [callback(err)]):追加数据到文件。如果文件不存在,则会创建该文件。

fs.unlink(path, [callback(err)]):删除文件。

fs.mkdir(dir, [options], [callback(err)]):创建目录。

fs.rmdir(dir, [options], [callback(err)]):删除目录。

fs.readdir(path, [options], [callback(err, files)]):读取目录的内容。回调函数接收两个参数,一个是错误对象(如果有错误发生),另一个是目录中的文件数组。

这些只是fs模块提供的一部分操作,实际上fs模块还提供了更多高级和底层的文件操作函数,以满足不同的需求。


03Node中事件模型如何使用,有哪些常见的操作

在Node.js中,事件模型是基于观察者模式实现的,允许你定义事件并在特定情况下触发这些事件。这种模型特别适用于处理异步操作,如I/O操作或定时器。


Node.js的事件模型主要使用EventEmitter类来实现。EventEmitter提供了几个关键的方法,允许你注册事件监听器、触发事件以及移除事件监听器。


以下是EventEmitter的常见操作:


注册事件监听器:


on(eventName, listener): 注册一个事件监听器,当指定的事件被触发时,会调用监听器函数。

addListener(eventName, listener): 与on方法功能相同,用于注册事件监听器。

示例:


javascript复制代码


const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.on('someEvent', function() {
console.log('someEvent has occurred!');
});
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/kjl536566/article/details/136469093

触发事件

  • emit(eventName, [...args]): 触发指定的事件,并传递任意数量的参数给事件监听器。

示例:

javascript复制代码

myEmitter.emit('someEvent'); // 输出: "someEvent has occurred!"

移除事件监听器

  • removeListener(eventName, listener): 移除指定事件的某个监听器。
  • off(eventName, listener): 与removeListener方法功能相同,用于移除事件监听器。
  • 示例:


javascript复制代码

const listener = function() {
console.log('someEvent has occurred!');
};
myEmitter.on('someEvent', listener);
myEmitter.emit('someEvent'); // 输出: "someEvent has occurred!"
myEmitter.removeListener('someEvent', listener);
myEmitter.emit('someEvent'); // 不输出任何内容
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/kjl536566/article/details/136469093

一次性监听器

  • once(eventName, listener): 注册一个只触发一次的事件监听器。

示例:

目录
相关文章
|
10月前
|
JavaScript 前端开发
浏览器中的事件循环和Node.js中事件循环的区别(经典面试题)
浏览器中的事件循环和Node.js中事件循环的区别(经典面试题)
568 0
|
10月前
|
前端开发
热点面试题:浏览器和Node的宏任务和微任务?
热点面试题:浏览器和Node的宏任务和微任务?
node笔记记录52两道面试题之面试题1之3四次挥手
node笔记记录52两道面试题之面试题1之3四次挥手
37 0
node笔记记录52两道面试题之面试题1之3四次挥手
node笔记记录52两道面试题之面试题1之1
node笔记记录52两道面试题之面试题1之1
48 0
node笔记记录52两道面试题之面试题1之1
node笔记记录52两道面试题之面试题1之2
node笔记记录52两道面试题之面试题1之2
45 0
node笔记记录52两道面试题之面试题1之2
|
存储 JavaScript 前端开发
【前端面试知识点】- 8. Node.js
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看作多个独立的应用来实现进程的调度、管理和资源分配。这是进程和线程的主要区别。
|
5天前
|
设计模式 SQL JavaScript
java面试宝典全套含答案
java面试宝典全套含答案
|
5天前
|
存储 Java
java面试题大全带答案_面试题库_java面试宝典2018
java面试题大全带答案_面试题库_java面试宝典2018
|
5天前
|
SQL 前端开发 Java
2019史上最全java面试题题库大全800题含答案(面试宝典)(4)
2019史上最全java面试题题库大全800题含答案(面试宝典)
|
5天前
|
SQL Java 数据库连接
2019史上最全java面试题题库大全800题含答案(面试宝典)(2)
2019史上最全java面试题题库大全800题含答案(面试宝典)