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:
- 定义常量时必须要给初始值
- 定义完常量后无法对常量进行重新赋值
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("文件写入成功")
})
});