nodejs学习笔记---1
1.初识NodeJs
什么时候NodeJS
能做什么
NodeJS环境搭建和运行
2.webstorm的使用
工程创建
webstorm的NodeJs配置
NodeJs代码提示
3.Node和JS的异同
基本语法
内置对象
全局对象
作用域
4.模块的使用
全局作用域
global对象
模块
模块概念
模块作用域
模块对象module
5.模块加载机制
模块的加载
require()
模块路径处理
模块文件查找机制
6.模块-module和exports
模块的创建
module对象
module.exports对象
exports对象
7.global对象
模块对象
__filename
__dirname
全局对象
setTimeout
setInterval
clearTimeout
clearInterval
Date
8.process对象
概念
属性和方法
argv
execPath
env
version
versions
pid
title
arch
platform
cwd()
chdir(directory)
memoryUsage()
exit(code)
kill(pid)
9.process对象-输入输出流
stdin、stdout:标准输入输出流(IO)
标准输入设备
标准输出设备
process.out.write()
输出流
process.in.resume()
恢复输入流
process.in.on('data')
接收输入流数据事件
10.Buffer-1
概念
Buffer类
new Buffer()
创建Buffer对象
Buffer对象数据的基本操作
bf[index] : 获取下标对应数据
bf.length : buffer长度
字符串和字节的区别
11.Buffer-2
Buffer对象的一些常用属性和方法
write()
toString()
toJSON()
slice()
copy()
12.Buffer-3
Buffer类的一些常用属性和方法
isEncoding()
isBuffer()
byteLength()
concat()
1、初识NodeJs
javascript是由三部分组成的
Ecmascript 定义了这门语言的一些基础,语法、数据类型、结构 还有一些常用的对象
BOM 基于Ecmascript扩展出来的用于页面操作元素的方法
DOM 基于Ecmascript扩展出来用于操作浏览器的一些方法
NodeJS也是基于Ecmascript扩展出来的一些操作非浏览器的一些方法,比如操作OS操作系统、file文件系统、database数据库、net网络
2、编辑器使用webstrom
可以直接右键run查看
使用setting配置nodejs的提示
3、node和js的区别
/*在ecmascript部分,nodejs和js其实是一样的,比如数据类型的定义,语法结构,内置对象
* 在js中的顶层对象 window
* 在node中的顶层对象 global
* 注意:在node中也没用什么window
*
* */
var a=100;
console.log(a); //100
var d=new Date();
console.log(d.getFullYear()); //2045
console.log(d.getMonth()+1); //10
var arr=[1,2,3];
arr.push(4);
console.log(arr); //[1,2,3,4]
function Person(name){
this.name=name;
}
Person.prototype.run=function(){
console.log(this.name+' running')
}
var p1=new Person('leo');
p1.run(); //leo running
4、模块的使用
在node中定义一个a,使用global不能访问到,是因为a是一个局部变量
var a=100;
console.log(global.a); //undefined
在node中有这样一个规定:
- 在node中,文件和模块是一一对应的,也就是一个文件就是一个模块
- 每个模块都有自己的作用域
- 我们使用var来申明的一个变量,它并不是全局的,而是属于当前模块作用域下的
var a=100;
console.log(a); //100
global.a=200;
console.log(a); //100
console.log(global.a);//200
说明此时定义的a和global.a是两个变量
//__filename:当前文件被解析后的绝对路径
console.log(__filename); //d:\wamp\www\nodejs\node1.js
以上可以得出结论:每个文件都有自己的模块,每个模块都有这个的属性
5、模块加载系统
定义一个node2.js的文件
console.log("这是node2.js");
要想在node1.js里面引用可以用
require('./node2.js')//这是node2.js
模块加载机制的两个问题
1.加载路径
require('模块加载的路径')
路径可以写相对路径或者绝对路径
2.文件查找特点:
- 首先按照加载的模块的文件名称进行查找
- 如果没有找到,则会在模块文件名称后加上.js的后缀,进行查找
- 如果还没有找到,则会在文件名称后加上.json的后缀,进行查找
- 如果还没有,则会在文件名称后加上.node的后缀,进行查找
- 如果还没有,会抛出错误
文件名称> .js >.json>.node >错误
6、模块-module和exports
在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接的访问
如果我们想在一个模块中能够访问另外一个模块中定义的变量,可以
- 把变量作为global对象的一个属性 ,但是这种做法不推荐
- 使用模块对象module
把变量作为global对象的一个属性
global.a=100;
使用模块对象module
module:保存提供和当前模块有关的一些信息,可以通过
console.log(module)
来查看都有哪些属性
在这个module对象,又一个子对象,exports 对象,我们可以通过这个对象把一个模块中的局部变量对象进行提供访问
在node5.js中写入
var a=100;
module.exports.a=a;
在node4.js中引入
var m5=require('./node5');//这个方法的返回值,其实就是被加载模块中的module.export
console.log(m5);//{ a: 100 }
在模块作用域内,除了module.exports还有一个内置模块对象,exports, 他其实就是module.exports
console.log(module.exports==exports)//true
返回值是true
所以也可以写为
exports.a=a;
输入结果一样
定义的一些细节尽量不去破坏它们的引用关系,
module.exports=[1,2,3]//如果不是赋值,而是重新定义,exports和module.exports的指向关系已经断开了
exports=[1,2,3]//这种定义也会断开
7.global全局对象
可以对照中文文档学习
__filename 和 __dirname不是全局的,而是模块本地的
也就是说要如下写法输出
console.log(__dirname);
console.log(__filename);
而不能加global.__filename
除了这两个ecmascript所规定的基本数据类型都是全局的如:数组array,日期date
var d=new Date();
var arr=[1,2,3]
8、process进程对象
包含很多参数
process.argv 包含命令行参数的数组。第一个元素是'node',第二个参数是 JavaScript 文件的名字,第三个参数是任意的命令行参数。
console.log(process.argv); //[ 'C:\\Program Files\\nodejs\\node.exe','d:\\wamp\\www\\nodejs\\node6.js' ]
process.execPath 开启当前进程的执行文件的绝对路径。
process.env 返回用户环境信息
process.version 返回node版本信息
process.versions 返回node及其依赖包的版本信息
process.pid 当前进程的 PID 任务管理器里面的详细信息pid
process.title 当前进程的显示名称 (Getter/setter) 获取/设置
process.arch 返回当前 CPU 的架构:'arm'、'ia32' 或者 'x64'
process.platform 返回当前操作系统平台
process.cwd() 返回当前进程的工作目录
process.chdir(directory) 改变当前进程的工作目录
process.kill(pid)向进程发出信息
exit(code) 退出
setInterval(function(){
var d=new Date();
console.log('现在的日期是:'+ d.getFullYear()+'年'+ (d.getMonth()+1)+'月'+ d.getDay()+'日 '+ d.getHours()+':'+ d.getMinutes()+':'+ d.getSeconds())
},1000)
setTimeout(function(){
process.exit()
},5000)
process.memoryUsage() 返回 Node 进程的内存使用情况,单位为byte
还有很多方法具体查看文档
9、stdin、stdout 标准输入输出流(IO)
---- 标准输入设备
---- 标准输出设备
---- stdin和stdout提供了操作输入数据和输出数据的方法,我们也通常称为IO操作
stdin 标准输入流
stdout 标准输出流
process.stdout.write('hello');
function Log(data){
process.stdout.write(data);
}
Log('你好')
默认情况下输入流是关闭的 ,要监听处理输入流数据,首先要先开启
//默认情况下输入流是关闭的 ,要监听处理输入流数据,首先要先开启
process.stdin.resume();
//用于监听用户的输入数据
process.stdin.on('data',function(chunk){
console.log('用户输入了'+chunk);//用户回车了才会触发
});
案例:计算加减乘数
var a,b; process.stdout.write('请输入a的值:'); process.stdin.on('data',function(chunk){ //判断如果a不存在执行 if(!a){ a=Number(chunk); process.stdout.write('请输入b的值:'); } else{ b=Number(chunk); process.stdout.write('结果是:'+(a+b)); } });
10.Buffer类
-
- 一个用于更好的操作二进制数据的类
- 我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流,node为我们提供了一个更加方便的去操作,这种数据流的类Buffer,它是一个全局的类
- 三种构造方式
-
new Buffer(size) 分配一个长度
-
new Buffer(array)
-
new Buffer(str[, encoding])
-
//new Buffer(size) size [number] 创建一个Buffer对象,并为这个对象分配一个大小 var bf=new Buffer(5);//5个长度的大小 当我们为一个Buffer对象分配空间大小以后,其长度是固定的,不能更改 console.log(bf);//<Buffer 00 00 00 00 80> bf[1]=20; console.log(bf);//<Buffer 00 14 00 00 80> 显示的是十六进制
var bf=new Buffer([1,2,3,4]); console.log(bf);//<Buffer 01 02 03 04> bf[10]=10;//增加内容 console.log(bf);//<Buffer 01 02 03 04> 其长度是固定的,不能更改
var bf=new Buffer('miaov','utf-8'); console.log(bf);//<Buffer 6d 69 61 6f 76> 把字符串转化编码
var bf=new Buffer('miaov','utf-8'); console.log(bf);//<Buffer 6d 69 61 6f 76> 把字符串转化编码 //检测字符串 bf.length 当前内容的字节长度并不是字符串的长度 for(var i=0;i<bf.length;i++){ console.log(String.fromCharCode(bf[i])); /* m i a o v */ } //比较字节和字符串长度 var str1='miaov'; var bf1=new Buffer(str1); console.log(str1.length); //5 console.log(bf1.length); //5 var str2='苗圩'; var bf2=new Buffer(str2); console.log(str2.length);//2 console.log(bf2.length);//6
buf.length 返回这个 buffer 的 bytes 数
buf[index] 获取或设置指定 index 位置的 8 位字节
buf.write(string[, offset][, length][, encoding]) 根据参数 offset 偏移量和指定的 encoding 编码方式,将参数 string 数据写入buffer。