当前位置: 首页 > 工具软件 > WebDAV.js > 使用案例 >

整理node.js面试题

水瀚漠
2023-12-01

1.let和var的区别

var声明变量可以重复声明,而let不可以重复声明,属于TDZ暂时性死区问题

作用域不同,var是函数作用域,而let是块级作用域

var可以在声明的上面访问变量,而let不存在变量提升

2.ES6中Symbol类型的作用

ES6新增了Symbol数据类型,它用来生成一个独一无二的值,它Symbol数据常用来给对象属性赋值,让对象属性具备唯一性,不容易被覆盖。

3.箭头函数有哪些特性

(1)、箭头函数是匿名函数,不绑定自己的 this,arguments,super,new.target

(2)、箭头函数会捕获其所在上下文的this值,作为自己的this值,在使用call/apply绑定时,相当于只是传入了参数,对this没有影响

(3)、箭头函数不绑定arguments,取而代之用rest参数…解决

(4)、箭头函数当方法使用的时候,没有定义this绑定

(5)、箭头函数不能作为构造函数,和 new 一起用就会抛出错误

(6)、箭头函数没有原型属性

(7)、不能简单返回对象字面量

4.ES6模板字符串的好处有哪些

(1)、模板字符串为构造多行字符串和字符串拼接带来了更加方便的方式。

(2)、同一个模板字符串可以通过使用不同的标签,对模板进行进一步处理,输出不同的结果

5.手写一个promise

var p = new Promise((resolve,reject)={

​        if(1){

​                  resolve(‘成功’)

​               }

​        else{

​                  reject(‘失败’);

​              }

})

p.then((res)=>{}).catch((err)=>{});
class Aniaml{

​              static Type = "动物";

​              constructor(newName){

​                this.name = newName;

​            }

​               eat(){

​                         conosle.log('please eat some apples');

​                     }

​             static drink(){

​                     console.log('please drink some water');

​                  }

}

7.class实现继承

class cats extends Animal{
    constructor(candy){
        super(candy);
    }
}

8.谈谈你对async和await的理解

async…await是基于promise的generator语法糖,是用来解决异步的,它用来等待promise的执行结果,常规函数使用await没有效果;

async函数返回一个 Promise 对象,可以使用then方法添加回调函数

当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句

9.class类中的super有哪些用法

super在类中有两种用法,一个是super方法,只能出现在constructor方法中;另一个是super对象,super对象一般出现在子类覆盖父类的方法中。

10.静态和成员的区别

成员的属性和成员的方法只能由对象使用;静态的属性和方法只能由类名字直接使用

静态的变量或方法归类所有,全局独一份,成员的变量或方法归对象所有,每次实例化对象成员方法和成员变量就会得到一份拷贝;对于一些通用性的属性或方法,可以考虑设置为静态。

11.谈谈你对promise的理解

Promise是为了异步数据传递,也用来解决异步回调问题;promise内部有三种状态,pedding,fulfilled,rejected;pedding表示程序正在执行但未得到结果,即异步操作没有执行完毕,fulfilled表示程序执行完毕,且执行成功,rejected表示执行完毕但失败;promise中的then一般对应成功后的数据处理,catch一般对应失败后的数据处理。

12.深拷贝的原理

操作的是值,取出对象的值,放到一个新的{},修改时不会影响到原数据;要完成对象的深拷贝需要使用递归遍历所有对象的属性进行赋值,也可以使用JSON.stringfy和JSON.parse操作。

13.set和Map的特点

Set是一种类似数组的集合类型,它与数组不同的是,不允许存在重复数据;常用操作方法有:add,delete,has,clear等;遍历使用forEach;

Map是一种类似对象的集合类型,它与对象不同的是,key可以接受对象类型,常用的操作方法有:set,get,has,delete等;遍历使用forEach

14.node的特点是什么

它是一个Javascript运行环境依赖于Chrome V8引擎进行代码解释事件驱动非阻塞I/O轻量、可伸缩,适于实时数据交互应用单进程,单线程

15.module.exports和 exports的区别,用代码示范

module.exports是实体抛出功能方法。exports只是module.exports的引用。

let module = {
            exports: {},
        };
let exports = module.exports;
 exports.title = 'lesson';
        //此时module.exports新增title属性为lesson
 exports = { name: 'AAA' };
        //此时module.exports保持原有的内容不变

16.npm的作用

用户可以从npm服务器上下载所需要的代码,使用指定命令能够快速安装插件,卸载插件,升级插件

允许用户上传自己写的代码到npm服务器上

17.常用npm指令有哪些

自动创建npm init -y

全部安装 npm i

安装产品模式的包 npm i/install/add 插件的名字 (-D/-P/-g),-D安装开发模式的插件,-P安装生产模式的插件,-g全局安装

查询插件的存放路径npm root (-g)

升级插件版本 npm update / up / upgrade 插件的名字

查看版本号 npm -v/version

18.实现深拷贝

JSON.parse(JSON.stringify(obj))

19.iterator的作用是什么,怎么部署iterator接口

1、统一数据结构(数组,对象,map,set,数组包对象,对象包数组)的遍历方式

2、在数据结构上部署iterator接口:所谓的部署接口表现形式为,给对象或数组等集合增加iterator属性,属性的内容是一个根据iterator接口规范自行实现的方法

20.实现数组过滤重复

//方法一
let arr=[1,2,5,4,5,1,3,4,6];
let map =new Map();
function f(attr) {
    return attr.filter((item)=>{
        return  !map.has(item)&&map.set(item); 
       }
    )
}
console.log(f(arr))

//方法二
let arr=[...new set(arr)];

21.关于对象扩展的属性简写和属性名表达式写法,请各举一个例子

//属性名简写:

let title = 'lesson';

let num =5;

let obj = {

​      title,

​      num

​    };

//属性名表达式:

let title = 'music';

 obj[title] = '钢琴';

22.什么是MIME,常见的MIME类型有哪些

MIME是多用途互联网邮件扩展类型。这是HTTP协议中用来定义文档性质及格式的标准。服务器通过MIME告知响应内容类型,而浏览器则通过MIME类型来确定如何处理文档。

超文本标记语言文本 .html text/html
xml文档 .xml text/xml
XHTML文档 .xhtml application/xhtml+xml
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
PDF文档 .pdf application/pdf
PNG图像 .png image/png
Microsoft Word文件 .word application/msword
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
css文件 .css text/css
Json文件 .json application/json
JS文件 .js text/JavaScript

23.模块加载机制

Nodejs遵循commonjs规范的模块加载机制,使用require加载文件,使用 exports或module.exports导出文件

24.URL的组成

URL是统一资源定位符 协议://子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值

25.fs文件操作模块是否能够删除一个非空目录

不能,需要递归遍历删除

function deleteDir(curpath) {
    // 判断当前路径或文件是否存在,存在则进行下一步
    if (fs.existsSync(curpath)) {
        // 读取当前目录下的所有文件或文件夹
        let files = fs.readdirSync(curpath);
        // 循环遍历文件或目录
        files.forEach(val => {
            // './demo'+val
            let tmp_path = path.join(curpath, val);
            // 判断是目录还是文件
            let isDir = fs.statSync(tmp_path).isDirectory();
            if (isDir) {
                deleteDir(tmp_path);
            } else {
                // 同步删除文件
                fs.unlinkSync(tmp_path);
            }
        });
        // 当前目录遍历完毕后,目录中不存在任何文件,所以删除当前目录
        fs.rmdirSync(curpath);
    }
}

deleteDir('./demo');

26.express中Router的作用?以及Router要解决的问题?

1): express.Router 可以认为是一个微型的只用来处理中间件与控制器的 app,

它拥有和 app 类似的方法,例如 get、post、all、use 等等。

(2): router它解决了直接把 app 暴露给其它模块使得 app 有被滥用的风险

27.npm start 命令, 应该在哪里配置, 在哪里可以正确运行?

(1), 在package.json中的 script中 配置npm 使用的命令

key是npm的自定义的命令名称,value是真正在终端中执行的命令

(2), 在使用npm 运行自定义命令时, 需要确保命令路径的位置上拥有package.json文件

28. express生成器的作用是什么?

通过应用生成器工具 express-generator 可以快速创建一个应用的kuang架, 包含一整套配置好的服务器配置, 文件和文件夹等, 包括静态资源的暴露等, 包括路由的配置, 和模板引擎配置, 以及404的处理

29.请回答, 前端Ajax请求后端接口/api/getNews, 接口过程中, 都发生了什么?

1 前段手机内容2 调用Ajax 3 传递参数和确认请求方式 4 后台对应的接口里的代码开始执行 6 铺设页面

参考答案: 首先前端代码运行在浏览器中, 由浏览器的XMLHTTPRequest发起一个请求, 如果通过了跨域的检测, 进行http连接, 发送请求信息, 服务器触发对应监听的"/api/getNews"接口的回调函数, 执行其中的代码, 最后res返回响应的内容等给本次请求的地方

30.请求对象中包含那些内容?

请求协议, 请求方式, 请求的URL, 请求头, 请求体

31.响应对象中包含那些内容?

响应协议, 响应状态码, 响应状态信息, 响应头, 响应的正文数据

32.express优点是什么?

Express 的优点是线性逻辑:路由和中间件完美融合,通过中间件形式把业务逻辑细分,简化,一个请求进来经过一系列中间件处理后再响应给用户,再复杂的业务也是线性了,清晰明了。

33.什么是中间件, 常用的第三方中间件有那些?

Express是一个自身功能极简,完全是路由和中间件构成一个web开发框架:从本质上来说,一个Express应用就是在调用各种中间件。封装了一些或许复杂但肯定是通用的功能, 非内置的中间件需要通过安装后,require到文件就可以运行。

第三方中间件:

cookie-parser:解析cookie

ejs:ejs模板

express-session:解析session

http-errors:错误中间件处理

Moment:日期时间处理

Morgan:日志打印

Multer:文件上传

Nodemon:热更新

config-lite: 读取配置文件

34.express缺点是什么?

Express 是基于 callback 来组合业务逻辑。Callback 有两大硬伤,一是不可组合,二是异常不可捕获。

35.什么是同步, 什么是异步操作?

同步操作, 当代码运行到同步操作的代码时, 所在线程等待结果返回

而异步操作, 则是不会耽误代码继续执行, 当异步操作成功, 一般使用回调函数来处理异步成功的动作(常用在ajax/定时器/计时器等

36.ejs作用是什么?

EJS是一个Javascript模板库, 用来从JSON数据中生成HTML文件

37. 什么是前后端分离项目 (JS渲染的项目又是什么)?

前端HTML页面通过AJAX调用后端的RESTFUL API接口并使用JSON数据进行交互

JS渲染的项目就是通过Ajax请求数据以后, 通过JS代码动态创建html的标签和数据等(一般右键查看网页源代码 是看不到渲染后的HTML标签的)

38.什么是后端渲染项目?

浏览器请求静态网页资源, 服务器端会在后端把数据渲染到HTML页面上, 再把html文件内的字符串一起返回给浏览器进行展示的一种手段, Nodejs中体现为ejs和pug模板引擎

39.设计一个前后端交互的流程?

前端编写HTML+CSS代码以后, 通过JS的Ajax进行网路请求, 请求后台指定的数据接口, 根据业务需求, 可以还需要传递参数等信息, 获取数据以后, 进行JSON解析和DOM创建展示.

服务器端 编写接口, 接收参数等, 连接数据库, 根据业务逻辑编写业务代码, 返回不同的数据

40.分页功能, 前后端是如何交互的?

分页功能, 前后端都可以做, 如果是前端做分页的话, 根据翻的页码数, 截取后台返回的全部数据, 进行分段展示

如果是前后端配合做, 则需要传递当前页码数给后台, 后台会返回对应页码的数据

41.session和cookie的作用和区别?

session是区别于数据库存在的一种服务器临时存储技术, 它主要存储一些无需持久化的数据, 比如临时的登录状态信息等

cookie是存在于浏览器上的一种浏览器本地存储的方式, 同域名下的cookie不同标签页可以共享, 默认过期时间是浏览器关闭时, 而且在进行http请求时, 会自动带上浏览器全部的cookie发给后台, 后台也可以获取cookie, 设置可以在响应时, 想浏览器中设置cookie。

42.跨域是什么, 如何解决跨域?

当ajax请求所在域名或接口和请求目标url的域名或接口, 有一个不同, 即发生了跨域请求, 浏览器会阻止这次ajax请求.

如果能让后台改代码, 可以让后台开启跨域支持/ 使用jsonp方式处理跨域

如果不能让后台改代码, 则需要在本地使用服务器, 进行代理转发

43.用递归删除非空目录

let fs = require('fs');

    // 删除非空目录函数
    function delDir (dir) {
        let filesArr = fs.readdirSync(dir);
        for (let i in filesArr) {
           let path = dir + '/' +filesArr[i] 
           let stat = fs.statSync(path);
            if (stat.isFile()) {
                fs.unlinkSync(path)  
            } else if (stat.isDirectory()) {
                delDir(path)  
            }
        }
        fs.rmdirSync(dir)
    }

    // 暴露出去
    module.exports = delDir;
    // 引入递归删除文件模块
    var delDir = require('./delDir');


    // 调用函数
    delDir(`D:\LBX`)

44.事件订阅与发布机制

事件订阅机制 EventEmitter,EventEmitter类由events模块定义的,其核心就是事件触
发与事件监听器功能的封装。这个类中有一个on()方法,用于将一个或多个事件监听器绑定到命名事件上。当事件被触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。EventEmitter 的核心就是事件触发与事件监听器功能的封装。EventEmitter类当新增监听器时,会触发 ‘newListener’ 事件;当移除已存在的监听器时,则触发’removeListener’ 事件。

45.npm的包依赖

“dependencies”: {//产品模式依赖

“devDependencies”: {},//开发模式依赖

46.npm全局安装与局部安装的区别

全局安装方式是键入命令:npm install express -g ,代表安装到全局环境里面,包安装在Node安装目录下的node_modules文件夹中

局部安装,可以直接通过require()的方式引入项目中node_modules目录下的模块

47.get和post请求的区别

48.node怎么设置允许跨域

49.如何设置ajax跨域携带cookie

$.ajax({ url : 'http://remote.domain.com/corsrequest', data : data, dataType: 'json', type : 'POST', xhrFields: { withCredentials: true }, crossDomain: true, contentType: "application/json"})

50.使用express的原因是什么

express是简单灵活的node.js Web应用框架,提供强大特性帮助创建各种web应用,有着丰富的http工具以及来自connect框架的中间件随取随用,创建强健友好的API变得快速简单

51.请说一下express4 中app和router的区别

app级路由不方便模块化封装,而且app.js文件没有路由代码,路由代码在router文件中,而且router方便模块化封装

52.请说一下express4如何接受get请求和post请求

53.请说一下express4中如何设置静态资源目录

app.use(express.static(path.join(__dirname, 'public')));

54.请说一下express4中的中间件是做什么的,如何使用

中间件是可以访问请求对象,响应对象以及next应用程序请求-响应周期中的函数,使用app.use()来使用/定义中间件

55.什么是ejs模板引擎?

EJS是一个Javascript模板库, 用来从JSON数据中生成HTML文件

56.你都有on过哪些node第三方的模块,功能是什么?

cookie-parser:解析cookie

ejs:ejs模板

express-session:解析session

http-errors:错误中间件处理

Moment:日期时间处理

Morgan:日志打印

Multer:文件上传

Nodemon:热更新

config-lite: 读取配置文件

57.关系型数据库和非关系型数据库有哪些区别?

存储方式不同(关系型采用表格存储,非关系以数据集方式),存储结构不同(关系型按照结构化的方法,非关系型采用的动态解构),存储规范不同,扩展方式不同,查询方式不同,事务性不同(关系型强调ACID,非关系强调BASE)

58.常见的关系型和非关系型数据库有哪些?

关系型:MySQL、Oracle、SqlServer

菲关系:mangoDB

59.HTTP协议通信模型

请求 -> 处理 -> 响应:
请求:由客户端发起请求;
处理:由服务器端处理请求;
响应:服务器端把处理的结果,通过网络发送给客户端;

60.HTTP协议会话步骤

●建立连接:客户端的浏览器向服务端发出建立连接的请求,服务端给出响应就可以建立连接了。
●发送请求:客户端按照协议的要求通过连接向服务端发送自己的请求。
●给出相应:服务端按照客户端的要求给出应答,把结果(HTML 文件)返回给客户端。
●关闭连接:客户端接到应答后关闭连接

61.http 与https的区别

1)http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
2)端口号不同http是80,https是443

62.http协议及其特点

HTTP(Hyper Text Transfer Protocol)< 超文本传输协议> 的缩写. 是用于从WWW 服务器传输超文本到本地浏览器的传输协议.HTTP 是一个应用层协议, 由请求和响应构成, 是一个标准的个客户端和服务器模型。通常基于TCP连接方式

  1. 支持客户端/ 服务器模型
  2. 简单快速
  3. 灵活
  4. 无连接
  5. 无状态

63.http请求和响应报文格式和常见状态码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LVEBBDe-1596450577648)(C:\Users\thinkpad\Desktop\前端\搜狗截图20200723234612.png)]

HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成;

HTTP 响应报文由状态行、响应头部、空行 和 响应包体 4 个部分组成

//常见状态代码、状态描述、说明:
102 请求已被接受,需要继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200 OK // 客户端请求成功
304 Not Modified重定向,需要进一步的操作以完成请求
400 Bad Request // 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 请求未经授权
403 Forbidden // 服务器收到请求,但是拒绝提供服务
404 Not Found // 请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error // 服务器发生不可预期的错误
503 Server Unavailable // 服务器当前不能处理客户端的请求,一段时间后可能恢复正常;

  1. 支持客户端/ 服务器模型
  2. 简单快速
  3. 灵活
  4. 无连接
  5. 无状态

63.http请求和响应报文格式和常见状态码

[外链图片转存中…(img-5LVEBBDe-1596450577648)]

HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成;

HTTP 响应报文由状态行、响应头部、空行 和 响应包体 4 个部分组成

//常见状态代码、状态描述、说明:
102 请求已被接受,需要继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200 OK // 客户端请求成功
304 Not Modified重定向,需要进一步的操作以完成请求
400 Bad Request // 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 请求未经授权
403 Forbidden // 服务器收到请求,但是拒绝提供服务
404 Not Found // 请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error // 服务器发生不可预期的错误
503 Server Unavailable // 服务器当前不能处理客户端的请求,一段时间后可能恢复正常;

 类似资料: