JaveScript第五周知识点
第一天知识点
- 保护对象:保护对象的属性和方法
- 四大特性:
- value:xxx,实际保存值的地方
- writable:true,开关:控制着是否可以被修改,默认值:true
- enumerable:true,开关:控制着是否可以被for in循环遍历到-默认值:都为true
- configurable:true,开关:控制着是否可以被删除-默认值:都为true。总开关:一旦设置为false,其他特性不可以再修改,而且本身也是设置为false不可逆
- 修改四大特性:
- object.defineProperty(对象名,"属性名",{修改四大特性}) 调用一次方法只能保护一个属性的四大特性
- object.defineProperties(对象名,{"属性名":{修改四大特性}}),这个方法至少只调用了一次,四大特性甚至不能防止添加
- 三个级别:
- 防扩展:防止添加:object.preventExtensions(obj);
- 密封:防止添加和删除:object.seal(obj);
- 冻结:防止添加和删除和修改:object.freeze(obj);
- 四大特性:
- 对象的深浅拷贝:
- 浅拷贝:var obj1={"name":"obj1"};var obj2=obj1;
- 深拷贝:var obj1={"name":"obj1"};var obj2={...obj1}
- 后端穿衣服:var jsonText=JsoN.Stringify(obj);Node.js这句话Node.js也是js,历史上第一次一门语言通吃前后端,此方法也能实现深拷贝
- Error对象:
- 浏览器自带4种错误类型:可以快速找到自己的错误
- 语法错误:SyntaxError,一定是符号写错
- 引用错误:ReferenceError,没有创建就去使用
- 类型错误:TypeError,不是你的方法你却使用了
- 范围错误:RangeError,只有一个API会碰到:num.toFixed(d);
- 只要发生错误,就会报错,会导致后续代码终止(闪退)
- 错误处理:就算发生错误,我们也不希望报错而是给出提示,后续代码可以继续执行
- 抛出自定义错误,只要是错误,后续代码都不会执行:throw new Error("自定义错误消息");
- Ess:严格模式
- 开启:"use strict";写在任何一个作用域的顶部都可以
- 作用:禁止了全局污染,使用变量之前必须先创建变量,将静默失败升级为了错误
- 柯里化函数: function add(a){return function(b){return function(c){console.log(a+b+c);}}}add(3)(5)(7)
- 浏览器自带4种错误类型:可以快速找到自己的错误
第二天知识点
- 匿名函数:
- 自调:只能执行一次,函数中的没用的变量是会自动释放的,可以用于代替全局代码写法,两者很相似:都会只执行一次,但是自调会释放
- 回调:匿名函数不是自调,就是回调
- elem.on事件名=function(){}
- arr.sort(function(){})
- var obj={"方法名":function(){}
- 一切回调函数,都可以简化为箭头函数
- 设计模型:不仅仅局限于前端,它是一种编程思想
- 单列模式:也许称之为单体模式, 保证一个类仅有一个实例对象,并且提供一个访问它的全局访问点
- 最简单的单列模式:利用Es6的let不允许重复声明的特性
- 发布订阅模式:vue的bus总线用到的底层原理就是发布订阅模式
- let obj={}
- function on(id ,fn){if(!obj[id])}
- 事件轮询:js其实是单线程引用,代码必然是从上向下,一步一步的执行,如果某一块代码非常耗时,可能会导致整个页面卡住,尤其把js放在head之中,会看到页面是一个白板
- 宏任务:不会卡住单线程应用,可以让后续代码先走,但是问题在于,多个宏任务同时存在,到底谁先执行谁后执行,分不清
- 微任务:Es6提供的promise对象,可以控制异步代码,依然是异步代码,但是可以控制执行的顺序
- 单列模式:也许称之为单体模式, 保证一个类仅有一个实例对象,并且提供一个访问它的全局访问点
第三天知识点
- 全栈的语言
- Jave语言,里面有JavaWeb,不包含移动端(安卓)
- JavaScript语言:
- 客户端-开发根本
- 服务器端-Node.js
- 数据库-mongoDB
- 移动端-网页/app/小程序/公众号/
- 混合开发框架:h5+plus/jqueryMobile/uniapp
- 基本内容
- 服务器端概念:简单来说就是一台电脑
- 软件架构:服务器
- Node.js概述
- 不是js,但是和js语法非常相似
- 做的功能绝对不是特效,和服务器端其他语言是一致
- 目的:
- 使用代码搭建一个服务器&文件系统
- Node.js如何沟通前端和数据库
- 全栈:图书管理系统(HTML+CSS+JS+Node+Mongo)
- Node.js如何运行
- 交互模式
- 脚本/文件模式
- 编辑器
- Node.js知识
- js和node的区别
- 相同点:都可以使用一切的ECMAScript的东西,包括一切的API
- 不同点:JavaScript:DOM+BOM
- NOde.js虽然没有DOM+BOM,但是都有10万+的模块
- 模块:每个xxx.js文件,都可以称之为是一个模块
- 每一个模块都有一个操作,可以用于公开/暴露自己的成员exports:Node.js自带的一个预定义变量,可以直接使用,是一个对象放在此对象里面的东西,就是允许公开的东西
- 每一个模块都有一个操作,可以用于导入/引用其他模块require:Node.js自带的一个预定义变量,可以直接使用,是一个函数,函数中需要书写出引用模块的路径
- 模块的分类:
- 官方模块
- 第三方模块
- 自定义模块
- Node.js最大特点
- 速度快,以前最快的是php,js的速度是php的16倍
- 官方模块:不需要下载,在安装node.js的时候就带上了
- 五个预定义变量
- _ _filename--获取当前文件的完整的绝对路径
- _ _dirname--获取当前文件绝对路径,不包含文件的名字
- exports--空对象,可以用于公开暴露自己的成员
- require--函数,可以用于导入其他模块
- module--指代当前模块本身,甚至包含以上4个模块
- querystring模块:解析查询字符串,使其变成一个对象,可以获取到前端传到后端的消息
- 需要引入:var qs=require(
querystring); - 解析url查询字符串部分功能
- 需要引入:var qs=require(
- url模块:
- 需要引入:var url=require(
url); - 作用:提供了解析url各个部分的功能
- 查询字符串:objUrl.query.键名-前端form表单提交传到后端的东西
- 路由/文件相对路径/请求地址:objUrl。pathname,判断路由的不同,去读取不同的HTML发送给用户看
- 需要引入:var url=require(
- Buffer模块:缓冲区,可以将数据变成一个16进制的数字,可以理解为Node.js中的一种新的数据类型
- fs模块:
- 需要引入:var fs=require(
fs); - 异步读取文件:fs.readFile("文件路径","新内容"/buf,()=>{console.log("要做什么必须放在这里面));
- 异步追加文件:fs.appendFile("文件路径","新内容"/buf,()=>{console.log("要做什么必须放在这里面));
- 需要引入:var fs=require(
- js和node的区别
第四天知识点
- 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 router=objurl.pathname;
- 字符串有一个API:Math
- var rs=str.math(reg);和indexof几乎一致,但是支持正则,
- http模块:搭建服务器
- 模块(每个.js文件)的分类
- 官方模块:不需要下载,在安装Node.js环境的时候就已经自带了,但是有的模块需要引入:reequire("模块名");
- 第三方模块
- 自定义模块:自己书写的xxx.js:require("./模块名");
- 文件模块:创建xx.js去公开需要公开的内容,主模块要引入,必须写为require("./模块名");
- 目录模块:
- 比如创建m1的文件夹,在其中创建index.js的文件,去公开需要公开的内容
- 比如创建m2的文件夹,在其中创建xx.js的文件,去去公开需要公开的内容容
- 创建文件夹必须名为:node_modules,再在其中创建出m3文件夹
- 如何下载第三方模块
- 打开cmd:检查npm是否安装成功:nopm-v
- 在你的项目中,再打开cmd
- 下载:npm i 包名
- 更新:npm up 包名
- 删除:npm um 包名
- Node.js操作mongoDB:
- 安装第三方模块:mongoose
- 使用步骤:
- 引入:const mongoose=require(
mongoose); - 连接数据库:mongoose.connect("mongoodb://ip地址,数据库名称");
- 创建出一个新的数据表的同时,设置数据类型的控制,防止用户乱输入、
- 增
- 删
- 改
- 查
- 引入:const mongoose=require(
第五天知识点
- mongo的语法:都是在客户端cmd输入
- 数据库的操作
- 查询所有数据库:show dbs
- 创建/切换数据库:没有就创建,有了就切换:use数据库名称
- 查看当前选中的数据库db
- 创建数据表:db。createCollection("表名")
- 删除数据库:db.dropDatabase();
- 数据表的操作
- 创建数据表
- 查看目前所有的数据表:db.getCollectionName();
- 删除数据表:db.表名.drop();
- 数据表的操作
-
增: var x=new User({//仅仅只是创建出了一个x对象,并没有放入到数据库之中 age: "20", pwd: "123123", email: "dy@qq.com", vip: "0", name: "dy", })
x.save((err)=>{ console.log("新增成功后要干什么"); })
-
删:User.remove/deleteOne/deleteMany({条件},(err)=>{// - 作者不推荐remove在mongoose之中使用 console.log("删除成功后要干什么"); })
-
改:User.update/updateOne/updateMany({条件},{新内容},(err)=>{// - 作者不推荐update在mongoose之中使用 console.log("修改成功后要干什么"); })
-
查:User.find({条件},(err,result)=>{ result就是你的查找到的结果 })
-
- 目前:前端能传到后端的技术,只有一个:form表单,action属性可以随便自定义一个路由名称,后端解析此路由就可以通过objUrl.query.键名得到想要的部分
- 数据库的操作