node.js 基础 (第一篇)

1. node.js 简介

node 的javascript解析器就是v8 引擎
在node中没有 dom 和 bom的概念 ,由以下三个部分组成;
1. ECMAScript 核心标准
2. 全局成员
3. 核心模板API
学习目标: 使用node平台搭建一个后台服务器,进行后端开发

REPL环境: Read Eval   Print  Loop 同浏览器控制台

2. ES6 语法

1.let关键字

产生原因: 因为 var 关键字存在一些问题

1.没有块级作用域
for (var i=0;i<10;i++){}   console.log(i)  //10

2.变量声明提升
console.log(a);  //undefined
var a;

如果使用 let 关键字则不存在以上两个问题:

1.由于块级作用域的存在
for (let i=0;i<10;i++){}  console.log(i)  //这个时候会报错  i is not defined
原因是因为let变量 存在块级作用域,所以外部访问不到,则报错

2.不会存在提升变量
console.log(a);  //报错:a is not defined
let a:

总结:使用let关键字声明变量的特点主要就是有块级作用域,必须先声明在使用,否则就会
报错,没有变量声明提升的概念

2.const 关键字
2.1 定义常量

const a=10 ;  //从此以后a不能重新赋值
a+1;  //没有对a赋值 所以不会报错
a+=1; // 报错: Assignment to constant variable  语法报错
canst b; 报错: Missing  initializer in const declaration

2.2 总结 const:

  1. 定义常量时必须要给初始值
  2. 定义完常量后无法对常量进行重新赋值
    let 和const 都必须要先声明在使用,并且都不可以重复声明

3 解构赋值
解构赋值一般使用将对象中的属性获取出来,存在变量中使用

let user ={
	name:' 张三',
	age:18,
	gender:"男"
}
//开发中如果需要将对象的属性值提取出来在变量中使用:
let uname =user.name;

//ES6新语法,将对象中属性批量提取到变量中:
let {name: username, age}=user;  //ES6新语法,将对象的属性批量提升,变量名必须在后面
name:username 是对name属性名,重新更改为username
console.log(username);
console.log(age);

4.箭头函数
ES6 中提出的一种新型匿名函数的语法,也可以理解为一种语法糖

let 函数名 =(形参1,形参2) => {
	//函数体
}

特点:指向外部函数的this,语法较为简单
注意:绑定事件是千万不要使用箭头函数,因为使用function绑定事件处理
函数时,内部的this指向事件源如果使用箭头函数绑定,则不会指向事件源

箭头函数的几种变体:
1, 函数只有一个形参,那么左侧的 ()可以省略

let fn 1 =(a) =>{
	return a+1;
}

let fn2=a=>{
	return a+1;
}
	2.函数体重只有一行代码,那么右侧的{}可以省略并且省略return ,默认会返回右侧代码执行的结果
let fn1=(a,b) =>{
	return a+b;
}
let fn2 =(a,b)=>a+b
	3.如果只有一个形参,并且函数体只有一行代码,那么两侧的(){}都可以省略
let fn1 =(a)=>{
return a+1;
}
let fn2 =a=>a+1

注意事项:只有一个形参的情况下可以省略左侧的(),奇特情况有多个参数获取没有参数都
必须加上()

5.声明对象属性的简洁语法
以前创建对象属性的字面量:

	var name="张三";
	var age =18;
	var weight =80;
	var user ={
		name:name,
		age:age,
		weight:weighe,
		eat:function(food)={
		console.log("吃了两碗"+food);
			}
	}

ES6 新语法:

let name ="张三";
let age=18;
let weight=80;
let gender="男";
let user ={
		name,
		age,
		weight,
		gender,
		eat(food){
		console.log("吃了两碗"+food)
			};
}

6.内置模块
所谓内置模块就是安装node.exe中这些模块包就已经安装在node本地中
6.1 fs模块
fs模块:File System 文件系统,node提供用于操作文件或目录的api都在该模块中

6.1.1 读取文件
readFile()

参数1:要读取的文件路径,string类型,如果是相对路径表示相对于当前执行node
命令的路径,而非相对当前文件,如果需要相对当前文件路径,
请使用: __dirname进行拼接

参数2: 编码 ,一般情况都需要指定编码,默认为null

参数3:回调函数,读取完文件后会执行,有两个参数,第一个参数为err ,
第二个参数是读取的数据为data

6.1.2 写入文件,会覆盖文件
writeFile()

参数1:要读取的文件路径,string类型,如果是相对路径表示相对于当前执行node
命令的路径,而非相对当前文件,如果需要相对当前文件路径,
请使用: __dirname进行拼接

参数2:要写得数据内容

参数3(可选):编码,默认为utf-8,一般就使用默认的

参数4:回调函数,写入文件后会执行,会有一个参数err写入失败时会有数据,如果err为null
表示写入成功

6.1.3 追加文件,在文件末尾继续追加
appendFile()

参数1:要读取的文件路径,string类型,如果是相对路径表示相对于当前执行node
命令的路径,而非相对当前文件,如果需要相对当前文件路径,
请使用: __dirname进行拼接
参数2:要写的数据内容
参数3(可选):编码,默认为utf-8,一般就使用默认的
参数4:回调函数,写入完文件后会执行,会有一个参数err为null表示写入成功

总结: 写入文件和追加文件都有共同的特点,如果要写入的目录下文件不存在,会自动创建文件并写入/追加

全局成员: __dirname,获取当前文件所在的绝对路径

因为在node中使用相对路径都是相对于当前指向node指令的目录,所以才会dirname和filename的存在

6.1.4 stat方法,获取文件或目录的信息
fs.stat ()
参数1:要获取的文件或目录的路径
参数2:回调函数,回调函数中有两个参数(形参),第一个是错误信息err,第二个文件或目录的信息对象stats
在stats对象中可以通过以下属性和方法获取信息:

stats.birthtime     创建日期,默认显示格式是格林威治时区
stats.size  文件大小
stats.isFile( )   判断是否为文件
stats.isDirectory()   判断是否为目录

6.1.5 copyFile() 复制文件
fs.copyFile()方法
参数1:要拷贝的源文件路径
参数2:目的地
参数3:回调函数,回调函数中有一个参数err,用于判断是否拷贝成功
如果目的地文件已存在,会直接覆盖

7 综合案例
源文件效果 3.txt
在这里插入图片描述

需要达到的效果 4.txt
在这里插入图片描述

文件路径:
demo04.js和文件夹file为同级目录
在这里插入图片描述

代码块:

const fs = require("fs"); //调用fs内置模块
//读取文件
fs.readFile(__dirname + "/file/3.txt", "utf-8", (err, data) => {
    if (err) return console.log('读取文件失败' + err.message)
    // console.log(data)
    let arr = data.split(" ")           //将文件3.txt中的空格去掉
    let newArr = []                     //定义一个空数组,用来储存新的成绩表
    arr.forEach(item => {                //遍历成绩表
        if (item.length > 0) {      //判断索引是否大于0,如果不大于0就没必要判断了,说明只有一个人的成绩
            let newScore = item.replace("=", ":") //将等号换成:号
            newArr.push(newScore)   //添加元素
        }
    })
    //将文件重新写入新的文件4.txt中,如果没有就会在目标路径中创建新的文件4.txt
    fs.writeFile(__dirname + "/file/4.txt", newArr.join('\n'), (err) => {   
        if (err) return console.log("文件写入失败" + err.message)
        console.log("文件写入成功")
    })
});

猜你喜欢

转载自blog.csdn.net/weixin_43072453/article/details/83512710