nodejs学习阶段习题测试及总结
⽬录
1.1.笔试题:
1.1.1 什么是NodeJS, 以及优缺点和特点?
简单来说Node.js就是运⾏服务端的Javascript。Node.js是⼀个基于Chrome Javascript运⾏时建⽴的⼀个平台,是⼀个事件驱动I/O服务端Javascript环境。基于Google的V8引擎,V8引擎执⾏Javascript的速度⾮常快,性能⾮常好。
NodeJs特点:
1.它是⼀个Javascript运⾏环境
2.依赖于Chrome V8引擎进⾏代码解释
3.事件驱动
4.⾮阻塞I/O
5.轻量、可伸缩,适于实时数据交互应⽤
6.单进程,单线程
NodeJS优缺点:
优点:
1.⾼并发(最重要的优点)。
2.适合I/O密集型应⽤。
缺点:
1.不适合CPU密集型应⽤。
CPU密集型应⽤给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运⾏的计算(⽐如⼤循环),将会导致CPU 时间⽚不能释放,使得后续I/O⽆法发起。
解决⽅案:分解⼤型运算任务为多个⼩任务,使得运算能够适时释放,不阻塞I/O调⽤的发起。
2.只⽀持单核CPU,不能充分利⽤CPU。
3.可靠性低,⼀旦代码某个环节崩溃,整个系统都崩溃。原因:单进程,单线程。
解决⽅案:(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端⼝;(2)开多个进程监听同⼀个端⼝,使⽤cluster模块。
4.开源组件库质量参差不齐,更新快,向下不兼容。
5.Debug不⽅便,错误没有stack trace
1.1.2 NPM是什么?它的好处?
npm是node.js的包管理⼯具,负责插件的更新、下载、卸载、发布和撤销等,允许⽤户从npm服务器上下载别⼈编写的第三⽅包到本地使⽤,或者将⾃⼰编写的包或命令⾏发布出去给别⼈使⽤。下载了node.js后,npm是其⾃带的,直接使⽤npm命令⾏使⽤插件即可。
具体思路步骤:
买个服务器作为代码仓库(registry),在⾥⾯放所有需要被共享的代码
发邮件通知 jQuery、Bootstrap、Underscore 作者使⽤ npm publish 把代码提交到 registry 上,分别取名 jquery、bootstrap 和underscore(注意⼤⼩写)
jquery在线免费学习社区⾥的其他⼈如果想使⽤这些代码,就把 jquery、bootstrap 和 underscore 写到 package.json ⾥,然后运⾏ npm install ,npm 就会帮他们下载代码
下载完的代码出现在 node_modules ⽬录⾥,可以随意使⽤了。
这些可以被使⽤的代码被叫做「包」(package),这就是 NPM 名字的由来:Node Package(包) Manager(管理器)。
优点:
允许⽤户从NPM服务器下载别⼈编写的第三⽅包到本地使⽤。
允许⽤户从NPM服务器下载并安装别⼈编写的命令⾏程序到本地使⽤。
允许⽤户将⾃⼰编写的包或命令⾏程序上传到NPM服务器供别⼈使⽤。
通过NPM,你可以安装和管理项⽬的依赖,并且能够指明依赖项的具体版本号。 对于Node应⽤开发⽽⾔,你可以通过package.json⽂件来管理项⽬信息,配置脚本, 以及指明项⽬依赖的具体版本。
1.1.3 ES5和ES6的区别,说⼀下你所知道的ES6
ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下⼀个版本标准,2015.06 发版。
ES6 主要是为了解决 ES5 的先天不⾜,⽐如 JavaScript ⾥并没有类的概念等等。
ES6增加了许多新的特性,如果⼤家想要深⼊的进⾏学习,可以进⾏⼀下的教程进⾏学习:)
下⾯我简单说⼀下我使⽤的⽐较频繁的ES6部分。
1.Template Literals(模板对象)
es6之前定义模版字符串要这样写(其中first和last 是变量)
var name ='Your name is '+ first +' '+ last +'.';
var url ='localhost:3000/api/messages/'+ id;
es6中使⽤新的语法${ },就简单多啦,注意es6中的模版字符串⽤得是反引号``(位置如图)
var name =`Your name is ${first}${last}. `;
var url =`localhost:3000/api/messages/${id}`;
2.Destructuring Assignment (解构赋值)
在es5中是这样写的
var data =$(‘body‘).data(),// data has properties house and mouse
house = data.house,
mouse = use;
在nodejs中是这样的
var jsonMiddleware =require(‘body-parser‘).jsonMiddleware ;
var body = req.body,// body has username and password
username = body.username,
password = body.password;
在es6中就简化了很多
var{ house, mouse}=$(‘body‘).data();// we‘ll get house and mouse variables
var{jsonMiddleware}=require(‘body-parser‘);
var{username, password}= req.body;
同样适⽤于数组
var[col1, col2]=$('.column'),
[line1, line2, line3,, line5]= file.split(‘n‘);
3.Arrow Functions in(箭头函数)
在ES6中,有了丰富的箭头函数。这些丰富的箭头是令⼈惊讶的因为它们将使许多操作变成现实,⽐如,以前我们使⽤闭包,this总是预期之外地产⽣改变,⽽箭头函数的迷⼈之处在于,现在你的this可以按照你的预期使⽤了,⾝处箭头函数⾥⾯,this还是原来的this。有了箭头函数在ES6中, 我们就不必⽤that = this或 self = this 或 _this = this 或.bind(this)。
箭头函数提供了⼀种更加简洁的函数书写⽅式。基本语法是:
参数 => 函数体
箭头函数体中的 this 对象,是定义函数时的对象,⽽不是使⽤函数时的对象。
var func=()=>{
// 箭头函数⾥⾯没有 this 对象,
// 此时的 this 是外层的 this 对象,即 Window
console.log(this)
}
func(55)// Window
var func=()=>{
console.log(arguments)
}
func(55);// ReferenceError: arguments is not defined
function fn(){
setTimeout(()=>{
// 定义时,this 绑定的是 fn 中的 this 对象
console.log(this.a);
},0)
}
var a =20;
// fn 的 this 对象为 {a: 19}
fn.call({a:18});// 18
不可以作为构造函数,也就是不能使⽤ new 命令,否则会报错。
适合使⽤的场景
ES6 之前,JavaScript 的 this 对象⼀直很令⼈头⼤,回调函数,经常看到 var self = this 这样的代码,为了将外部 this 传递到回调函数中,那么有了箭头函数,就不需要这样做了,直接使⽤ this 就⾏。
// 回调函数
var Person ={
'age':18,
'sayHello':function(){
setTimeout(function(){
console.log(this.age);
});
}
};
var age =20;
Person.sayHello();// 20
var Person1 ={
'age':18,
'sayHello':function(){
setTimeout(()=>{
console.log(this.age);
});
}
};
var age =20;
Person1.sayHello();// 18
所以,当我们需要维护⼀个 this 上下⽂的时候,就可以使⽤箭头函数。
我就先说这么多吧,ES6还有⾮常多的新特性值得我们去学习和使⽤,⽐如说Class累,⽐如说Promise对象等等等。我们需要深⼊的去学习。
1.1.4 var、let、const之间的区别
在了解它们三个之间的区别的时候我们需要先来了解⼀下什么是变量提升?
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使⽤后声明,也就是变量可以先使⽤再声明。
⼀、var声明变量存在变量提升,let和const不存在变量提升
console.log(a);// undefined ===> a已声明还没赋值,默认得到undefined值
var a =100;
console.log(b);// 报错:b is not defined ===> 不到b这个变量
let b =10;
console.log(c);// 报错:c is not defined ===> 不到c这个变量
const c =10;
再来看这段代码
function fn(){
//var a
if(true){
console.log(a +' now')
}
else{
var a =1
console.log(2)
}
}
fn()// a -> undefined
我们发现不执⾏的代码也会影响会执⾏的代码,因为var a会提升到if语句的前⾯
undefined可以翻译为不明确,not defined可以翻译为未定义
在Java中变量的分为全局变量(成员变量)或者局部变量,在⽅法体中定义的变量都是局部变量,否则是全局变量(即在⽅法体外,在类中定义的变量)
在JavaScript中,在⽅法体外外⽤var定义的变量其它⽅法可以共享,在⽅法中⽤var定义的变量只有该⽅法内⽣效。
⼆、let、const都是块级局部变量
顾名思义,就是只在当前代码块起作⽤
{
let a =1
}
console.log(a)// undefined
const 的特性和 let 完全⼀样,不同的只是
1)声明时候必须赋值
const a
编译器报错
控制台报错
SyntaxError: Missing initializer in const declaration
2)只能进⾏⼀次赋值,即声明后不能再修改
const a=1
a=2
编译器报错
控制台报错
TypeError: Assignment to constant variable.
3)如果声明的是复合类型数据,可以修改其属性
三、同⼀作⽤域下let和const不能声明同名变量,⽽var可以
const a =2
const a=1
SyntaxError: Identifier 'b' has already been declared
1.1.5 介绍下Set和Map的区别?
集合(Set):
ES6 新增的⼀种新的数据结构,类似于数组,但成员是唯⼀且⽆序的,没有重复的值。Set 本⾝是⼀种构造函数,⽤来⽣成 Set 数据结构。
Set 对象允许你储存任何类型的唯⼀值,⽆论是原始值或者是对象引⽤。
const s =new Set()
[1,2,3,4,3,2,1].forEach(x => s.add(x))
for(let i of s){
console.log(i)// 1 2 3 4
}
// 去重数组的重复对象
let arr =[1,2,3,2,1,1]
[...new Set(arr)]// [1, 2, 3]
字典(Map):
是⼀组键值对的结构,具有极快的查速度。
const m =new Map()
const o ={p:'haha'}
m.set(o,'content')
<(o)// content
m.has(o)// true
m.delete(o)// true
m.has(o)// false
区别:
Set:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论