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网络

安装及环境配置(windows系统)

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中有这样一个规定:

    1. 在node中,文件和模块是一一对应的,也就是一个文件就是一个模块
    2. 每个模块都有自己的作用域 
    3. 我们使用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:wampwww
odejs
ode1.js

以上可以得出结论:每个文件都有自己的模块,每个模块都有这个的属性

5、模块加载系统

定义一个node2.js的文件

console.log("这是node2.js");

要想在node1.js里面引用可以用

require('./node2.js')//这是node2.js

模块加载机制的两个问题

1.加载路径

require('模块加载的路径')

路径可以写相对路径或者绝对路径

2.文件查找特点:

    1. 首先按照加载的模块的文件名称进行查找
    2. 如果没有找到,则会在模块文件名称后加上.js的后缀,进行查找
    3. 如果还没有找到,则会在文件名称后加上.json的后缀,进行查找
    4. 如果还没有,则会在文件名称后加上.node的后缀,进行查找
    5. 如果还没有,会抛出错误

文件名称> .js >.json>.node >错误

6、模块-module和exports 

在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接的访问
如果我们想在一个模块中能够访问另外一个模块中定义的变量,可以

    1. 把变量作为global对象的一个属性 ,但是这种做法不推荐
    2. 使用模块对象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。

原文地址:https://www.cnblogs.com/eveblog/p/4861674.html