Node入门
一、Node简介
1.Node是JavaScript脚本的运行平台。
(1)Node将Chrome的V8引擎封装起来,作为服务器运行平台,以此来执行JavaScript编写的脚本语言。
(2)使JavaScript只能在前段运行的脚本,变成了可以访问文件、访问数据库、访问线程等功能的服务器端的开发语言。
2.Node的特点:
(1)非阻塞I/O:非阻塞I/O又称异步式I/O,是node的重要特点 。
(2)事件驱动:非阻塞I/O是一种异步方式的I/O,与事件驱动密不可分。
(3)单线程:node的引用程序是单进程、单线程的,但是通过事件和回调支持并发,性能变得非常高。node.js采用非阻塞I/O与事件驱动相结合的编程模式,与传统同步I/O线性编程思维有很大的不同,node程序的控制很大程度要依靠事件和回调函数,这不符合开发人员的常规性思路,需要讲一个完整的逻辑拆分为若干单元(事件),从而增加了开发和调试的难度。在JavaScript的任务层面上是单线程的,Node平台本身是多线程的。
二、第一个Node程序
1.http访问服务器的地址格式
http://服务器地址:端口号/文件名
本地计算机的IP:127.0.0.1---->对应的名称localhost
2.搭建第一个node程序
// 1.导入http模块
const http = require('http');
// 2.创建一个服务器
const httpServer = http.createServer(function (req,res) {
res.writeHead(200,{'content-type':'text/html;charset=utf-8'});
res.end('你好,服务器向你发送了响应信息!');
});
// 3.注册监听端口:告诉服务器运行的端口
httpServer.listen(8000,function () {
console.log('服务器启动成功了!')
});
三、Node程序的运行方式
1.node 文件名
2.使用npm包管理器:
(1)在package.json文件里配置启动:
"scripts": {
"start": "node ./src/server.js",
"test": "echo \"Error: no test specified\" && exit 1"
}
(2)使用npm start 来启动
四、Node的语法基础
1.每条语句以分号结束,没有严格限制
2.一行代码可以包含多条语句(注意:如果一行有多条语句,每条语句都要以";"结束。建议一行只有一条语句)
3.若一行语句太长,可以使用“\
”进行换行
4.语句块:由多条语句组成,这些语句都在“{}“中。
5.注释:
(1)单行注释://
(2)多行注释:/*
…*
/ webstorm中的快捷键: Ctrl+shift+/
6.变量:
(1)可以是任意的数据类型
(2)变量名是由字母、数字、下划线(’_’),$组成的字符系列,但是首字符不能是数字
(3)JavaScript是弱类型语言,定义变量时不需要指定变量的类型,都可以使用关键字var来声明
(4)可以在声明变量的同时赋值,也可以先声明变量然后再赋值
(5)变量可以反复赋值
7.变量提升:在ES5中,变量可以在声明之前使用,它的值是undefined。
在ES6中使用let关键字声明变量,变量不能在声明之前使用。
8.变量值的泄露:在语句块中使用var关键字声明的变量,会被提升为全局变量,这样就会造成局部变量值的泄露。防止变量值泄露的方法是使用let关键字声明局部变量。
9.全局作用域和函数作用域
(1)ES5中作用域只有两个:
- 全局作用域:从声明的位置开始到源程序结束均有效
- 函数作用域:只在函数范围内有效
(2)ES6中增加的块级作用域:在ES6中声明的变量只在它所声明的块级作用域中有效
10.ES6中使用const定义只读常量
const pi = 3.1415926;
console.log(pi);
11.数据类型
(1)Number:数值类型,不区分整数和浮点数
二进制以0b开头,八进制以0o开头,十六进制以0x开头。
如果不能计算得出结果,显示为NaN(Not a Number)。
Infinity表示无限大。
(2)String:字符串,使用单引号或者双引号括起来的文本(字符序列)
- ES6提供模板字符串:使用反引号将字符串括起来,使用${}将变量括起来
// 模板字符串
let host = 'http://localhost';
let port = 8080;
let url = `文档地址为:${host}:${port}`;
console.log(url);
- 模板字符串中可以不嵌入任何变量,按实际格式输出
(3)Boolean:布尔型,值只有两个。true和false
注意:在比较等于时,建议使用===,而不是==
(4)null和undefined
null:表示一个空值,什么都没有
undefined:表示未定义,一般用于判断函数的参数是否正常传递
(5)Array:数组
- 数组用{}表示,元素之间用逗号分隔
- 数组元素可以是任意类型
- 通过数组名带索引来访问数组元素,索引范围是0~数组长度减1
(6)Object:对象
- 对象用‘{}’来表示,是由键值对组成的一个无序集合,键值对之间用逗号分隔
- 键的类型必须是字符串类型,值可以是任意类型。
- 键就是对象的属性。
- 通过’对象名.属性名(键名)'来访问对象的属性
- 在ES6中允许将表达式作为键名,但表达式必须放在’[]'中
(7)Symbol:符号,是ES6引入的新类型,用来表示一个独一无二的值,这个值可以作为对象的属性。
Symbol类型的使用(表示方法有三种)
1.对象[属性]=value
let k = Symbol(); let obj = {}; obj[k]='你好'; console.log(obj);
2.在对象中直接用左键
let k = Symbol(); let myobj = { [k]:'大学生' } console.log(myobj);
3.
Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。let k = Symbol(); let obj1 = {}; Object.defineProperty(obj1, k, { value: 29, writable: true, enumerable: true, configurable: true });
(8)Set:集合。集合中的元素没有重复,都是唯一的。
- 遍历集合和数组
//Set集合 var arr = [1,3,1,3,4,2,4,5,9]; const s =new Set(); arr.forEach(x => s.add(x)); //forEach循环依次从数组中取出一个值赋给x。 //遍历集合 for (let i of s){ console.log(i) } console.log('--------') // forEach循环 s.forEach(value => { console.log(value) })
- Set可以接收一个数组作为参数
var arr = [1,3,1,3,4,2,4,5,9]; const s1 = new Set(arr); console.log(s1); console.log(Set.prototype.constructor); //[Function: Set] 构造函数 console.log(s1.size); //6 集合的元素个数
- 方法(函数)
add(x):将x添加到集合中
delete(x):删除集合中的x,返回的是一个布尔值
has(x):返回一个布尔值,表示x是否是集合的一个成员
clear():清楚集合中的所有成员,没有返回值
- 遍历的操作
// forEach()遍历 s.forEach(value => { console.log(value) }); // keys()返回键名的遍历器 console.log(s.keys()); // 遍历的是键值对 console.log(s.entries());
其他方法
// map() let set = new Set([1, 2, 3, 4]); let newset = new Set([...set].map(x => x * 2)); // 通过map遍历集合中的元素,使得集合中的元素乘以2,返回到新的集合中 console.log(newset); //filter() 过滤器使用 let set1 = new Set([1, 2, 3, 4, 5, 6, 7, 8]); let newset1 = new Set([...set1].filter(x => x % 2 == 0)); console.log(newset1);
- 集合操作(并,交,差)
//并集 let a = new Set([1,2,3]); let b = new Set([4,3,2,1]); let c = new Set([...a,...b]); console.log(c) //求交集 使用过滤器 console.log(new Set([...a].filter(x => b.has(x)))); //差集 console.log(new Set([...b].filter(x => !a.has(x))));
- WeakSet集合
(1)集合中的元素只能是对象,不能是其他类型
(2)JavaScript中的垃圾回收机制不考虑WeakSet中元素的回收