1. 什么是NodeJS, 以及优缺点和特点?
NodeJs是一个事件驱动I/O服务端、基于 Chrome V8 引擎的 JavaScirpt 运行环境。
NodeJs的特点:异步事件驱动、非堵塞I/O、轻量、可伸缩,适于实时数据交互应用、单进程,单线程
NodeJs的优缺点:
优点:高并发(最重要的优点)、适合I/O密集型应用
缺点:不适合CPU密集型应用
2. NPM是什么?它的好处?
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题:
允许用户从NPM服务器下载别人编写的第三方包到本地使用。
允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
3. ES5和ES6的区别,说一下你所知道的ES6
ECMAScript6在保证向下兼容的前提下,提供大量新特性,ES6特性如下:
4. var、let、const之间的区别?
var
声明的变量是全局的
let
声明的变量只在 let 命令所在的代码块内有效。
const
声明一个只读的常量,一旦声明,常量的值就不能改变。
5. 介绍下Set和Map的区别?
Map 对象
保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
Set 对象
允许你存储任何类型的唯一值,无论是原始值或者是对象引用,类似于数组结构。
6. 下面的输出结果是多少?
const promise = new Promise((resolve, reject) => {
console.log(1);
resolve();
console.log(2);
})
promise.then(() => {
console.log(3);
})
console.log(4);
输出结果为1,2,4,3
then 方法的特点
在 JavaScript 事件队列的当前运行完成之前,回调函数永远不会被调用。
7. 分别介绍普通函数中this和箭头函数中this?
普通函数下的this:
箭头函数中的this:
8. 什么是Buffer? 并创建长度为6个字节的Buffer对象?
Buffer(缓冲区),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
Buffer类是以字节数组的方式进行存储数据
let buf = Buffer.alloc(6);
console.log(buf);
//
let buf = Buffer.from('世界你好', 'utf8');
console.log(buf);
utf-8
的编码格式:一个字符=三个字节
输出12个字节
10. 什么是闭包,闭包有哪些用处?
闭包:
定义在一个函数内部的函数,能够读取函数内部的变量
可以让这些变量的值始终保持在内存中,调用之后不会被清除
方便调用上下文的局部变量,利于代码封装
使用场景:setTimeout、回调函数、封装私有变量
11. 你知道fs有哪些常用的方法(至少5个)
fs.mkdir():异步创建文件目录
fs.readFile():读取文件(异步操作)
fs.writeFile():写入文件(异步操作)
fs.stat():检查文件属性(异步操作)
fs.appendFile():异步地追加数据到文件
12. node中的异步和同步怎么理解?
同步的概念通俗的说就是代码以此往下执行,也就是阻塞式;
同步API执行顺序是:只有当前API执行完毕之后,才能继续执行下一个API,从上到下依次执行
异步就是非阻塞式,当我们发出指令的操作后我们的程序可以继续往下执行,等到操作完成后执行回调。
异步API:当前的API并不阻塞后边的代码的执行,而且所有带箭头函数的API函数
13. express response有哪些常用方法?
express:express.static()、express.Router()、express.urlencoded()、app类(post、get、use)
response: res.url()、res.write()、res.writeHead()、res.end()、res.send()
14. node有哪些核心模块?
fs文件系统、Buffer(缓冲区)、http、path路径、art-template 、express
15. 说一下get和post的区别以及何时使用POST?
function unique3(array){
var n = [array[0]]; //结果数组
//从第二项开始遍历
for(var i = 1; i < array.length; i++) {
//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
//那么表示第i项是重复的,忽略掉。否则存入结果数组
if (array.indexOf(array[i]) == i) n.push(array[i]);
}
return n;
}
//ES5写法 继承
function Person(name,age){
this.name = name;
this.age = age;
}
//函数 sayHello 写在原型中
Person.prototype.sayHello = function(){
console.log(`hello,大家好,我叫${this.name},我今年${this.age}`);
};
var per= new Person('zhangsan',18);
console.log(per);
per.sayHello();
//ES6中添加class的概念 js中的class本质就是基于原型做了进一步封装
class Person{
//用来创建====》实例化一个对象
constructor(name,age){
this.name = name;
this.age = age;
}
sayHello(){
console.log(`hello,大家好,我叫${this.name},我今年${this.age}`);
}
}
var per = new Person('palia',19);
console.log(per);
per.sayHello();
// extends实现继承父类
class Student extends Person{
//自定义构造器==》Stu()
constructor(name,age,stuID){
//super()的使用实例 一一一子类重写父类的方法
super(name,age);//指向的是 父类 的 构造函数constructor
this.stuID = stuID;
}
study(){
console.log(`我叫:${this.name},学号:${this.stuID}`);
}
}
const s1 = new Student('lala',19,110);
console.log(s1.name);
s1.study();
要求如下:
css文件夹 img文件夹 js文件夹 index.html页面
//require()导入模块
//导入路径操作模块
const path = require('path');
//导入文件操作系统 模块
const fs = require('fs');
//文件操作
//初始化目录结构
//img css js
//创建项目 存储的目录地址
let root = 'C:\\Users\\star0\\Desktop\\NodeJS';
let initData = {
projectName:'mydemo',
data:[
{name:'img',type:'dir'},
{ name: 'css', type: 'dir' },
{ name: 'js', type: 'dir' },
{name:'index.html',type:'file'}
// dir指向的是当前执行的父级路径,file指向的是当前执行脚本路径,
]
}
// path.join() 方法会将所有给定的 path 片段连接到一起
// 创建项目的根路径
// fs.mkdir(path.join('C:\\Users\\star0\\Desktop\\NodeJS','mydemo'));
fs.mkdir(path.join(root,initData.projectName),(err)=>{
if(err){
return;
}
});
let fileContent=`
Document
`;
//创建子路径和文件
initData.data.forEach((item)=>{
if (item.type=='dir') {
//创建子目录
fs.mkdirSync(path.join(root,initData.projectName,item.name))
} else if(item.type=='file'){
//创建文件 并写入内容
fs.writeFileSync(path.join(root,initData.projectName,item.name),fileContent)
}
})
// 基于NodeJS实现动态网站的开发
// 创建后台 就是服务器的功能
const http = require('http')
const fs = require('fs');
const path = require('path');
const queryString = require('querystring');
const scoreData = require('./data.json');
http.createServer((req, res) => {
// 路由(请求路径+请求的方式)
if (req.url.startsWith('/query') && req.method == 'GET') {
let content = template(path.join(__dirname, 'view', 'index.art'), {})
res.end(content);
} else if (req.url.startsWith('/score') && req.method == 'POST') {
// 获取成绩的结果 /score
let pdata = '';
// 请求数据时 触发的事件data
// 将 post请求 传递过来的数据 使用变量 pdata接受
req.on('data', (chunk) => {
pdata += chunk;
});
// 请求数据结束时 触发的事件
req.on('end', () => {
// 将字符串类型的数据 转换为 对象类型
let obj = queryString.parse(pdata);
let result = scoreData[obj.code];
console.log(result);
let content = template(path.join(__dirname, 'view', 'result.art'), result)
res.end(content);
})
} else if (req.url.startsWith('/all') && req.method == 'GET') {
// 全部成绩
console.log(scoreData);
let content = template(path.join(__dirname, 'view', 'list.art'), {
list:[scoreData.no123,scoreData.no124,scoreData.no125,scoreData.no126]
})
// console.log(content);
res.end(content);
}
// res.end('服务器异常');
}).listen(3000, () => {
console.log('running.....');
})
/ get请求
/login get请求
/register post请求
/index get请求
/about get请求
(1) 再写一个可以 不限任何请求方法 的路由匹配
(2) get请求一个动态路由(参数假设为当前本地日期) 并将请求的数据获取到返回给客户端
var express = require('express');
var app = express();
app.get('/',function(req,res){
res.send('hello Express');
})
app.get('/login',function(req,res){
res.send('login');
})
app.get('/index',function(req,res){
res.send('index');
})
app.get('/about',function(req,res){
res.send('about');
})
app.post('/register',(req,res)=>{
res.send('post请求')
})
app.use('/index',(req,res)=>{
res.send('use方法')
})
//通过req.params 获取路由中的参数
app.get('/news/:year/:month/:day',(req,res)=>{
console.log(req);
res.send(req.params);
})
app.listen(3000,()=>{
console.log('running...')
})