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): 注册一个只触发一次的事件监听器。

示例:

目录
相关文章
|
2月前
|
Web App开发 JavaScript 前端开发
前端Node.js面试题
前端Node.js面试题
|
JavaScript 前端开发
浏览器中的事件循环和Node.js中事件循环的区别(经典面试题)
浏览器中的事件循环和Node.js中事件循环的区别(经典面试题)
794 0
|
前端开发
热点面试题:浏览器和Node的宏任务和微任务?
热点面试题:浏览器和Node的宏任务和微任务?
node笔记记录52两道面试题之面试题1之3四次挥手
node笔记记录52两道面试题之面试题1之3四次挥手
49 0
node笔记记录52两道面试题之面试题1之3四次挥手
node笔记记录52两道面试题之面试题1之1
node笔记记录52两道面试题之面试题1之1
63 0
node笔记记录52两道面试题之面试题1之1
node笔记记录52两道面试题之面试题1之2
node笔记记录52两道面试题之面试题1之2
59 0
node笔记记录52两道面试题之面试题1之2
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
28天前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
53 4