ES6、nodejs阶段性测试题总结(笔试+编程)

笔试题

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特性如下:

  • 关键字let, const(块级作用域)
  • 解构赋值
  • Symbol
  • Reflect 与 Proxy
  • Promise对象
  • 迭代器(Iterators)
  • Generators函数
  • Class类(constructor、extends、super)
  • Modules
  • Map 和 Set 等

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总是代表它的直接调用者,在默认情况下,this指的是window,
  • 在严格模式下,没有直接调用者的函数中的this是 undefined使用
  • call,apply,bind(ES5新增)绑定的,this指的是 绑定的对象

箭头函数中的this:

  1. 箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象),
  2. 而不是执行时的对象, 定义它的时候,可能环境是window,也有可能是其他的。

8. 什么是Buffer? 并创建长度为6个字节的Buffer对象?
Buffer(缓冲区),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

Buffer类是以字节数组的方式进行存储数据

let buf = Buffer.alloc(6);
console.log(buf);
//
  1. 如下代码输出多个个字节?
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?

  • GET使用URL或Cookie传参。而POST将数据放在BODY中。
  • GET的URL的长度会有长度上的限制, POST的数据则可以非常大。
  • GET没有POST安全,因为数据在地址栏上可见。
    登录验证账号密码时常用Post请求方式

编程题

  1. 封装一个方法 去除数组中重复的元素
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;
}
  1. 有Student 和Person 两个类, Person 类有name 属性和sayName 方法, Student 类继承自Person 类. 分别使用ES5 和ES6 的语法实现.
//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();
  1. 通过代码创建一个网站基本结构
要求如下:
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)
    }
})
  1. 做一个成绩查询案例,根据学号查询学员成绩 并展示到搜索框的下面.
    (注: 使用JSON数据存储学员成绩,使用模板引擎art-template渲染数据)
// 基于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.....');
})
  1. 模拟用户登录实现账户和密码的验证
    使用Express搭建服务 并实现以下路由分发
 /           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...')
})

你可能感兴趣的:(node.js,javascript,html5,es6,node.js,NPM)