补充(for in)
<script>
var obj = {
name:"张三",
age:18,
gender:"男"
}
// i 遍历的就是属性名
// 获取属性值 对象名[i]
for (const i in obj) {
console.log(i);
console.log(obj[i]);
}
</script>
01 、Nodejs 介绍
1、什么是node?
基于chrome V8引擎的JavaScript运行环境。
2、 js:运行在浏览器, 开发前端程序。
node:运行在服务器 ,开发后端程序。
3、静态页面:数据都是写死的。HTML+CSS+JS
动态页面:数据都是动态的。HTML+CSS+JS+后端接口
4、为什么要学习node?
(1) 中小型项目快速开发
(2) 全栈:前端,后端都可以做(全干)。
02、Nodejs的下载与安装
2.1
1、node中文网站:nodejs.cn。14版本只有win8以上才支持。
2、安装:下一步直到结束。
3、检测是否成功:
3.1 命令行(cmd)在任意位置结合shift右键
3.2 在VScode中打开终端(ctrl+`):
node --v (node --version)。如果成功显示版本号说明node安装成功了。
3.3 npm -v (npm是node自带的包管理工具)
【注意】如果在vscode中不能运行npm,则输入set-ExecutionPolicy RemoteSigned。
2.2 初始化node项目:生成package.json 这个项目的配置文件
npm init 逐步设置配置文件
npm init -y 快速生成配置文件
ECMA语法
BOM
DOM
对于node来说,
只有ECMAScprit,没有BOM和DOM,不过多了一些文件操作和IO流等等功能。
03、试用node执行js
node执行js:在命令窗口:使用 node.js文件的路径 ,按下回车即可。
04、模块化
4.1 面临的问题
如果你是未使用模块化之前的毕业生,你在接收项目时,可能会遇到的问题:
- 变量名冲突:不同文件中的变量如果重名,前面的会被后面的覆盖,造成程序的执行错误。
- 文件依赖顺序:多个文件之间如果存在依赖关系,需要保证加载顺序的准确。
4.2 什么是模块化
模块化本质:就是一个实现特定功能的js文件。
模块化开发:是一个管理方法,是一种生产方式,解决问题的方案。
模块化可以让我们更方便的使用已经写好的代码,想要实现什么功能,就加载什么模块。
就像积木,需要拼接什么形状,就使用相应的积木。
4.3 模块化的方案
4.3.1 闭包和函数作用域
利用闭包和自执行函数
var 模块名 = (function(){
....
return {
变量1,
变量2
}
})(引入其他的模块名...)
模块名.变量
这种方法是所有模块化的基础。
- 各个文件之间避免了变量名的冲突。
- 减少了全局变量。
- 模块的外部无法修改闭包内部的变量,增加程序的稳定性。
- 明确了依赖关系。
4.3.2 ES6模块化
在ES6之间,是没有模块化的概念的.
如果要使用模块化的操作:一种是闭包+自执行函数,一种是引入第三方的类库。
ES6第一次支持了模块化,多个两个模块:export 导出m模块、import 导入模块。
导出模块的两种方式:
(1)exports.模块名 = 模块;
(2)module.exports = 模块;
export 变量的声明赋值
import {变量名} from “模块路径”
【注意】在引入模块文件时,需要在script标签中添加type属性,属性值为 module。
如果需要抛出多个变量名,则可以将这些变量包装成对象输出。如果不想暴露模块中的变量名,可以通过as来操作。
var aNum = 10;
var aStr = "a";
export {
aNum as num,
aStr as str
}
接收:
import {num,str} from "./a.js";
console.log(num,str);
4.3.3 默认导出
一个模块只能有一个默认导出,对于默认导出,导入的名称可以和导出的名称可以不一样。
export default function(){
console.log("此去泉台招旧部,旌旗十万斩阎罗");
}
import ss from "./a.js";
ss();
可以导出对象:
export default {
fn(){
console.log("此去泉台招旧部,旌旗十万斩阎罗");
},
age:18
}
import ss from "./a.js";
ss.fn();
console.log(ss.age);
基础导出和默认导出:
export default {
fn(){
console.log("此去泉台招旧部,旌旗十万斩阎罗");
},
age:18
}
export let userName = "zhangsan"
import ss,{userName} from "./a.js";
ss.fn();
console.log(ss.age);
console.log(userName);
05、默认导出多个
1、a.js如下:
export default {
fn(){
console.log("此去泉台招旧部,旌旗十万斩阎罗");
},
age:18
}
2、b.js如下:
import ss from "./a.js";
ss.fn();
console.log(ss.age);
3、index.html如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="b.js" type="module"></script>
</head>
<body>
</body>
</html>
06、混合使用
1、a.js如下:
export default {
fn(){
console.log("此去泉台招旧部,旌旗十万斩阎罗");
},
age:18
}
export let userName = "zhangsan";
2、b.js如下:
import ss,{userName} from "./a.js";
ss.fn();
console.log(ss.age);
console.log(userName);
3、index.html如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="b.js" type="module"></script>
</head>
<body>
</body>
</html>
07、node的模块化
1、a.js如下:
function fn1(){
console.log("我是a模块中的fn1函数");
}
function fn2(){
console.log("我是a模块中的fn2函数");
}
// module对象是node自带的模块化对象,该对象下有一个空对象,exports。
我们将需要暴露出去的对象,直接赋值给exports即可,就对外暴露了接口。
// 暴露
module.exports = {
fn1,
fn2
}
2、b.js如下:
function fn1(){
console.log("我是b模块中的fn1函数");
}
function fn2(){
console.log("我是b模块中的fn2函数");
}
// 暴露
module.exports = {
fn1,
fn2
}
3、test.js如下:
// 在需要引入的模块中,使用require引入,用变量接收。
// 格式: let 变量名 = require(“模块路径”);
let moduleA = require("./a.js");
let moduleB = require("./b.js");
moduleA.fn1();
moduleA.fn2();
moduleB.fn1();
moduleB.fn2();
08、导入的另外一个写法
1、a.js如下:
function fn1(){
console.log("我是a模块中的fn1函数");
}
function fn2(){
console.log("我是a模块中的fn2函数");
}
exports.fn1 = fn1;
exports.fn2 = fn2;
2、b.js如下:
function fn1(){
console.log("我是b模块中的fn1函数");
}
function fn2(){
console.log("我是b模块中的fn2函数");
}
// 暴露
module.exports = {
fn1,
fn2
}
3、test.js如下:
// 在需要引入的模块中,使用require引入,用变量接收。
// 格式: let 变量名 = require(“模块路径”);
let moduleA = require("./a.js");
let moduleB = require("./b.js");
moduleA.fn1();
moduleA.fn2();
moduleB.fn1();
09、exports和module.exports的区别和相同点
- exports可以多次导出,但是module.exports只能导出一次,多次导出最后一次生效。
- exports和module.exports本质是相等的。
- exports是一个引用,指向的是module.exports。
- 如果在同一个文件中使用两种导出,给exports添加的属性和方法,也会添加在module.exports上,但是添加在module.exports上的属性和方法,不会添加在exports上。
10、文件读取
-
node的模块大致可分为三大类:
-
1.内置模块(nodejs原生提供的)可以直接使用。
-
2.自定义模块 (需要手动的导出)。
-
3.第三方模块(需要下载安装然后才可以使用)。
-
自定义模块:
-
定义模块:
-
通过module.exports = 模块 导出模块
-
通过exports.属性名(模块名) = 模块 导出模块
-
引入模块:
-
const 变量名 = require("模块路径")
-
node可以操作文件,可以创建服务器,可以连接数据库等等。
-
读取文件:
-
1.引入fs内置模块
-
2.调用readFile方法
-
3.指定读取文件的路径
-
4.指定读取的编码
-
5.回调函数 读取的时候执行的操作。
-
6.err 是读取失败时的错误信息
-
7.data 是读取的内容。
// 1.引入fs内置模块 这个模块是专门用来操作文件的
const fs = require("fs"); //引入文件系统模块
fs.readFile("./b.txt",'utf-8',function(err,data){ // 2.readFile 方法 是读取文件中的内容
console.log("错误信息为"+err); // function后是回调函数
console.log("读取到的内容为"+data);
})
11、文件写入
**1.引入fs内置模块 写入**
const fs = require("fs");
let data = "hello world";
// writeFile 方法是写入,覆盖式 第一个参数:写入文件的路径
// 第二个参数:写入的内容。
// 第三个参数:一个函数,写入完成后执行. err表示错误信息,如果成功执行,则err为null
fs.writeFile("./a.txt",data,function(err){
if(err){
console.log(err);
}
})
**2.appendFile 追加**
const fs = require("fs");
let data = "花开花落";
fs.appendFile("./a.txt",data,function(err){
if(err){
console.log(err);
}
})
eg:读取a.txt文件,将a.txt文件的内容写入到b.txt。
a.txt:床前明月光,疑似地上霜。 (另存为utf-8)
b.txt:
index.js如下:
const fs = require("fs");
fs.readFile("./a.txt","utf-8",function(err,data){
if (err) {
console.log("读取失败:"+err);
return;
}
fs.writeFile("./b.txt",data,function(err){
if (err) {
console.log("写入失败:"+err);
}
})
})
【注意】b.txt里将写入a,txt里的内容。
12、文件读写
const fs = require("fs");
fs.readFile("./a.txt","utf-8",function(err,data){
if (err) {
console.log("读取失败:"+err);
return;
}
fs.writeFile("./b.txt",data,function(err){
if (err) {
console.log("写入失败:"+err);
}
})
})