第五周JS知识梳理

81 阅读9分钟

day19

1、保护对象

每个属性都有六大特性:可以操作

Object.defineProperties(obj,{

"属性名":{

value: 实际存储值的位置,

writable: true/false,开关,控制着是否可以被修改

enumerable: true/false,开关,控制着是否可以被for in遍历到

configurable: true/false,开关,控制着是否可以被删除,还是一个总开关,一旦改为false,其他特性不可以在修

改,一旦改为false,而且不可逆

get:()=>{只要获取数据的时候就会触发,拦截到数据},

set:()=>{只要设置数据的时候就会触发,拦截到数据,可以做出动态数据},

}

})

三个级别:
	1、防扩展:Object.preventExtensions(obj);
	2、密封:Object.seal(obj);
	3、冻结:Object.freeze(obj);

2、对象的深浅拷贝:

1、浅拷贝:利用按值传递 var obj1={}; var obj2=obj1;

2、深拷贝:两者长得一样,但是互不影响
	var obj1={};
	var obj2={...obj1}
	var obj3=JSON.parse(JSON.stringify(obj1));

3、Error对象:

1、浏览器自带4种错误类型:

1、语法错误:SyntaxError

2、引用错误:ReferenceError

3、类型错误:TypeError

4、范围错误:RangeError - 只有一个API会遇到num.toFixed(0~100)

2、错误处理:因为报错后导致后续代码中断,我们不希望这个事情发生

	try{
		可能出错的代码
	}catch(err){
		err - 错误消息,但是可能是英文的
	}

	try...catch性能低下,我们用分支去代替它

3、抛出自定义错误:

	throw new Error("自定义错误消息");

4、ES5 - 严格模式

	"use strict";

	作用:
		1、禁止了全局污染
		2、将静默失败升级为报错

4、柯里化函数:

方法名()()()(); 说明函数里面在不断的return出函数我们才能不断的调用

day20

1、回调函数:没有名字的函数:

1、自调:

只能执行一次,好处:代替掉全局写法,函数中【没用的变量】会自动释放

(function(){
    操作
})();

2、回调:

匿名函数不是自调,就是回调,往往都是前辈们创建好了,我们学习如何使用,一切的回调都可以简化为箭头函数(一定要学会考虑this

2、设计模式:编程思想

1、单例模式:一个类只能创建一个对象

2、观察者(订阅-发布)模式:一个发布,所有的订阅者都可以看到

3、事件轮询:因为JS默认是单线程应用,代码只能从上向下慢慢执行

    1、宏任务(异步代码):可以让后续代码先做,我们复杂的代码慢慢来,但是多个宏任务同时出现,无法确定先后顺序
   
           1、定时器
   
           2、ajax

    2、微任务:Promise对象

	new Promise(ajax1).then(ajax2).then(ajax3);

	注意:
		1Promise中的回调函数一定要放行,下一个才会执行
		2、想要连续的.then出去前一个返回的是一个Promise对象
            

day21

1、Node.js:

不是JavaScript,只不过语法和JavaScript非常相似,做的事也不是做特效,而是和数据库做交互

2、模块的分类:

1、官方模块 - 不需要下载,但是有需要引入,有的不用引入

1Global - 全局模块,不需要引入,提供了一些东西

    1、\_\_filename - 获取当前文件的完整的绝对路径

    2、\_\_dirname - 获取当前文件的绝对路径,但是不包含文件名,这样我们就可以自己拼接自己需要的路径

    3exports - 空对象,放在里面的东西,就是可以公开给别的模块使用的

    4require - 函数,调用它就可以引入其他分支模块

    5module - 指代当前模块本身,甚至包含着以上4个操作,exports=module.exports

    6、定时器 - 用法和以前一样

    7console - 用法和以前一样

            2、querystring - 解析查询字符串部分的一个模块
                需要引入:var qs=require("querystring");
                APIvar obj=qs.parse("查询字符串");
                往往前端传来的是一个完整的url,他解析不了,而且有人里面自带着他

            3、url - 解析url的一个模块
                需要引入:var url=require("url");
                APIvar objUrl=url.parse("url",true);
                
                重点:
			1、请求消息:objUrl.query.键名;
			2、路由:objUrl.pathname;

            4Buffer - 不需要引入,可以看作是Node.js的一种新的数据类型,但是我们不喜欢,因为我们看不懂,Node大部分API都是Buffer5、fs - 文件系统模块
                需要引入:var fs=require("fs");
                异步读:
			fs.readFile("文件路径",(err,buf)=>{
				读取到了要干什么,必须放在这里面
			})

                异步写:- 会把原来的东西替换掉
			fs.writeFile("文件路径","新内容"/buf,(err)=>{
				写入完了要干什么,必须放在这里面
			})

                异步追:- 不会把原来的东西替换掉
			fs.appendFile("文件路径","新内容"/buf,(err)=>{
				写入完了要干什么,必须放在这里面
			})

2、第三方模块 - 在npm这个网站上放着的,我们可以学习npm如何下载

3、自定义模块:引入时必须这么写:require("./文件路径");

day22

1、Node.js官方模块:

http模块:搭建服务器&文件系统
var http=require("http");
var url=require("url");
var fs=require("fs");
var app=http.createServer();
app.listen(80);
app.on("request",(req,res)=>{
var objUrl=url.parse(req.url,true)
var router=objUrl.pathname;//甚至昨天没用到的请求消息:objUrl.query.键名; - 是一个对象
if(router=="/"||router=="/index.html"){
fs.readFile("文件路径",(err,buf)=>{
res.end(buf);//一个请求只能有一个响应
})
}else if(router.match(/html/)!=null){
fs.readFile("./public/html"+router,(err,buf)=>{
res.end(buf);//一个请求只能有一个响应
})
}else if(router.match(/css|js|.../)!=null){
fs.readFile("./public"+router,(err,buf)=>{
res.end(buf);//一个请求只能有一个响应
})
}else if(router=="login/register/getNews...")
})

2、自定义模块有两种用法

1、文件模块

2、目录模块:

创建node_modules,再在其中创建xx文件夹,再在其中创建index.js,公开需要公开的内容,主模块引入,就可以

写入:require("xx")

不是人为使用的,而是npm下载会自带的

3、npm:

下载:npm i 包名;

day23

mongo就是基于json的数据库:json就是JavaScript Object Notation - JS的一部分,所以用法和JS的用法都很

像,都是用.去做操作

1、安装&启动:

1、解压我提供的mongodb-win32-x86\_64-2008plus-ssl-3.6.11.zip文件
2、打开bin文件夹,里面有:mongo.exe(客户端) 和 mongod.exe(服务器端)
3、如何启动:
    在bin文件夹中打开cmd:输入:.\mongod.exe --dbpath=你想要保存的绝对文件夹路径 - 服务器开启成功,而且那个文件夹就是保存着你以后要存储的所有的数据
    千万不要关闭mongo服务器端的cmd
    再打开一个cmd:输入:.\mongo.exe - 再上一个cmd可以查看我们是否连接成功 - 客户端开启成功

2、mongo的语法:都是在客户端cmd输入

1、数据库的操作

1、查询所有数据库:show dbs

2、创建/切割数据库:没有就创建,有了就切换:use 数据库名称

3、查看当前选中的数据库:db

4、创建数据表:db.createCollection("表名");- 没有限制,无限,一定要先创建数据表后,我们才能查看到自己创建的数据库

5、删除数据库:db.dropDatabase(); - 一旦删除就不能恢复,不推荐,因为要坐牢,最好忘记

2、数据表的操作

	1、创建数据表:db.createCollection("表名",{size:5242880,capped:true,max:5000}); - 最大存储空间为5mb,最多存储5000个,意味着这个数据表做了限制,不推荐
	2、查看目前所有的数据表:db.getCollectionNames();
	3、删除数据表:db.表名.drop(); - 一旦删除就不能恢复,不推荐

3、*****数据的操作

	1、增:db.表名.save({键值对,...}) - 一次只能插入一条数据
		db.表名.save([{},{},{},{},....]) - 一次插入多条数据
		举例:db.user.save({name:"paoge",pwd:"123123",age:18,email:"pg@qq.com",vip:1})
		          db.user.save([{name:"hujiayuan",pwd:"333333",age:17,email:"hjy@qq.com",vip:0},{name:"luohongliang",pwd:"666666",age:16,email:"lhl@qq.com",vip:0},{name:"zhaoxiao",pwd:"999999",age:64,email:"zx@qq.com",vip:1}])

	2、删:db.表名.remove({}) - 不推荐,删除数据库中所有的数据
		db.表名.remove({条件}) - 条件依然也是键值对,比如: db.user.remove({name:"paoge1"}) - 会删除数据表中name叫做paoge1的所有数据

	3、改:db.表名.update({条件},{$set:{新内容}})
		举例:db.user.update({name:"zhaoxiao"},{$set:{age:65,pwd:"222222"}})

	4、查:db.表名.find(); - 找所有
		db.表名.find({pwd:"666666"}); - 找到所有密码为666666的数据
		db.表名.find({},{name:1,pwd:1}); - 找到所有的数据,但是只返回name和pwd(登录!)
		db.表名.find().sort({age:1}); - 按age升序排列!
		db.表名.find({age:{$gte:18}}) - 拿到所有age大于等于18的数据,gt大于 gte大于等于 lt小于  lte小于等于(获取成年人)
		db.表名.find({name:/o/}) - 甚至可以用正则(模糊查询)
		db.表名.find().skip(5).limit(5) - 跳过前5条,在拿5条数据,理解为5-10条数据(点击分页条应该拿到哪些数据)
		db.表名.find().count() - 获取到此表有多少条数据(做出分页条)

3、安装mongDBCompass软件:图形化界面,直观、好看、方便 - 仅仅用于我们方便查看


4、Node.js操作mongoDB - Node.js官方并没有提供过操作数据库的API

1、安装第三方模块:mongoose

2、使用步骤:
	1、引入:var mongoose=require("mongoose");
	2、连接数据库:mongoose.connect("mongodb://127.0.0.1/h52302");
	3、创建出一个新的数据表的同时,设置数据类型的控制,防止用户乱输
		var UserSchema=mongoose.Schema({
			name:String,
			pwd:String,
			age:Number,
			email:String,
			vip:String
		})
		//		模型名随意的        数据的控制         表名,没有则为创建,有了则为选中!
		var User=mongoose.model("User",UserSchema,"user")


	4、增:21、创建要插入的对象
		var x=new User({
			name:"name",
			pwd:"123456",
			age:"123",
			email:"XXX@qq.com",
			vip:"1"
		})
		2、创建好的对象插入到数据表中
		x.save().then(()=>{
			console.log("插入完毕了,你要干什么,必须放在这个里面,因为他也是异步")
		})

	5、删:
		User.deleteOne/deleteMany({条件}).then(()=>{
			console.log("删除完毕了,你要干什么,必须放在这个里面,因为他也是异步")
		})

	6、改:
		User.updateOne/updateMany({条件}).then(()=>{
			console.log("修改完毕了,你要干什么,必须放在这个里面,因为他也是异步")
		})

	7、查:
		User.find({条件}).then((rs)=>{
			rs->查询到的数据
		})
	

	目前:前端能传到后端的技术,只有一个:form表单,action属性可以随便自定义一个路由名称,后端解析此路由就可以通过Object.query.键名得到前端传来的东西