05.js与node.js

97 阅读9分钟
一.保护对象:保护对象的属性和方法
  1. 四大特性:

         {value:101,//实际保存值的地方
         writable:true,//开关控制着是否可以被修改--默认值为true
         enumerable:true//控制是否可以被forin遍历循环,默认值为true
         configurable:true//控制着是否可以被删除,默认为true,总开关一旦设置为false其他特性不可以修改,而且它本身一旦设置为false不可逆}
    
  2. 修改四大特性

         1.Object.defineProperty(对象名,“属性名”),{修改四大特性})调用一次方法只能保护一个属性的四大特性
         2.Object.defineProperties(对象名,{“属性名”:{修改四大特性},只调用一次方法,四大特性甚至不能防止添加
    
  3. 三个级别:一个是防扩展,防止添加Object.preventExtensions(obj);第二个是密封,防止添加和删除Object.seal(obj);第三个是冻结,防止添加,删除和修改Object.freeze(obj)

  4. 如果不用面向对象开发,则不用保护对象

四大特性的作用
  1. 可以帮助我们做出动态数据

    Object.defineProperty(obj,"name",{get:()=>{console.log("获取数据会进行拦截");},
    set:v=>{console,log("设置数据会进行拦截");v//拦截到的新数据
    d1.innerHTML=v}}) vue框架中的所有数据都是动态数据,意味着它的底层就做了拦截操作
    
  2. 对象的深浅拷贝:

     浅拷贝var obj1={"name":"obj1"}; var obj2=obj1其中任何一个变化双方的值都会受到影响
     深拷贝var obj1={"name":"obj1"}; var obj2={...obj1}
    
  3. Error错误对象,浏览器自带4种错误:语法错误SyntaxError--大多数符号写错了;引用错误ReferenceError--没有创建就去使用了;类型错误TypeError--不是你的方法,却使用了这个方法;范围错误RangeError--只有这个会遇到num.toFixed(d)

  4. 错误处理:发生错误,不会出现报错而是给出错误提示,让后续代码可以继续执行,语法try{只放入可能出错的代码}catch(err){发生错误后才会执行的代码 alert(err)//err是英文的错误提示 alert("中文错误提示"),不过try..catch..的性能非常差,可以用分支结构代替他

  5. 柯里化函数 function add(a){return function(b){return function(c){console.log(a+b+c)}} }-----add(1)(2)(3)

  6. 网站的定位技术都是使用的GPS,开发者可以直接使用百度,高德地图。

  7. 匿名函数:有两种

         匿名自调函数,只能执行一次,函数中的变量会自动释放。
         (function(){console.log(1)});
         ();
         匿名回调函数:一切回调函数都可以简化为箭头函数
         elem.on事件名=function(){}
         arr.sort=(function(){})
         var obj={“方法名”:function(){}}
    
  8. 设计模式:是一种编程思想,有21种设计模式

  • 单例模式也称为单体模式,保证一个类仅有一个市里对象,并且提供一个访问它的全局访问点。最简单的单例模式,利用let不允许重复声明的特性,刚好符合单例的特点如:let obj={"name":"姓名1", "getName":()=>this.name,}}不推荐维护时不易管控

  • 推荐写法

      var h52301=(function){let state=nullreturn function(name,age){
                              this.name=name;this.age=age;
                              if(state){return state;}
                              return state=this;}}) ();
    
  • 发布订阅模式:vue的bus总线用到的底层原理就是发布订阅模式

       let obj={};//创建订阅者
       function on(id,fn){if(!obj[id]){//判断有没有此id(有没有这个人),没有我就创建了一个空数组 obj[id]=[];}
       obj[id].push(fn);}
       on("老袍",(msg)=>{console.log("小兰来了",msg)});
       on("老袍",(msg)=>{console.log("小尹来了",msg)});
       console.log(obj);//{"老袍":[fn,fn]}
       //发布者的操作
     function emit(id,msg){
     obj[id].forEach(fn=>fn(msg));//obj["老袍"].forEach}
      	btn.onclick=()=>{
      	emit("老袍","一支穿云箭");
      	}
    
  1. 事件轮询:js其实是单线程引用,代码必然是从上到下,一步一步执行如果某块代码非常耗时,可能会导致整个页面卡住。1、宏任务:不会再卡住我们的单线程应用,可以让后续代码先走,我们慢慢跟着来,但是问题在于,多个宏任务同时存在,到底谁先执行谁后执行,分不清。2、微任务:ES6提供的Promise对象 - 可以控制异步代码,依然是异步代码,但是可以控制执行的顺序了

        function ajax1(resolve){
     		    setTimeout(()=>{console.log(1);
     		    resolve();
     		    },Math.random()*5000);}
     	
    function ajax2(){
     	     return new Promise(resolve=>{
     	     setTimeout(()=>{console.log(2);
     			     resolve();
     			},Math.random()*5000);})}
     	
    function ajax3(){
     	     return new Promise(resolve=>{
     			setTimeout(()=>{
     				console.log(3);
     				resolve();
     			},Math.random()*5000);})}
     	
    new Promise(ajax1).then(ajax2).then(ajax3);//promise的回调函数提供了一个形参函数,可以用于放行console.log("后续代码");
    

Node.js

Node.js不是JS,但是语法和JavaScript非常相似,属于服务器端的语言,和数据库进行交互,成为了一个前端到数据库的中间桥梁。

  1. 模块(module):每一个xx.js文件,都可以称之为一个模块。

  2. 每一个模块都有一个操作,可以用于公开暴露自己的成员---exports:Dode.js自带的一个预定义变量,可以直接使用,是一个对象,放在此对象里的东西就是允许公开的东西。

         语法:1.exports.属性名=属性值;
               2.module.exports={属性名:属性值,..}
    
  3. 每一个模块(主模块)都有一个操作,可以用于导入/引入其他模块:require:Node.js自带的一个预定义变量,可以直接使用,是一个函数,函数中需要写出引入模块的路径:var x=require(“./文件名”)

  4. exports和module.exports有什么区别?写法,语法不同;是用于公开暴露自己的成员的,但是exports={},写法是错误的。Node.js底层有一句话:exports=module.exports其实真正做公开功能module.exports如果你使用了exports={};//你创建了一个新的空对象,所以不在具有公开的功能

  5. 模块的分类分为三类,官方模块,第三方模块,自定义模块

  • 官方模块:不需要下载,但是有的模块需要引入,有的模块不需要引入。

      1.Global模块,不需要引入,可以直接使用,提供了五个预定义变量__filename获取当前文件完整的绝对路径;__dirname获取当前文件绝对路径,不报含文件名字;exports空对象用于公开暴露自己的成员;require用于导入其他模块;module指代当前模块本身,包含以上4个操作。
      2.querystring模块:解析查询字符串。需要引入var qs=require(“querystring”)var obj=qs.parse("查询字符串");
      3.url模块需要引入:var url = require('url');作用:提供了解析url各个部分的功能;var objUrl=url.parse("网址",true)---->路由/文件相对路径/请求地址:objUrl.pathname - 判断路由的不同,去读取不同的HTML发送给我们的用户看
      4.4Buffer模块:缓冲区,可以将数据变成一个16进制的数字,你可以理解为是Node.js中的一种新的数据类型
      5.fs模块:需要引入:var fs = require('fs');异步读取文件fs.readFile("文件路径",(err,buf)=>{buf=>读取到的内容})。异步写入文件:fs.writeFile("文件路径","新内容"/buf,()=>{console.log("写入完毕后,要做什么,必须放在这里面");})//会替换掉原来的东西;异步追加文件:fs.appendFile("文件路径","新内容"/buf,()=>{console.log("写入完毕后,要做什么,必须放在这里面");})//会替换掉原来的东西
      6.http模块--搭建服务器,//引入了http(搭建服务器),url(区分开路由和请求消息),fs(读取文件响应给用户看)
      var http=require("http");var url=require("url");var fs=require("fs")
      创建服务器应用:var app=http.createServer();
      为其绑定监听窗口(默认窗口80):app.listen(80);
      为其绑定请求事件:http:请求--响应模式,必须要有一个请求,才有一个响应  app.on("request",(err,res)=>{var objUrl=url.parse(req.url,true)
      保存路由:var router=objUrl.pathname;
      if(router=="/" || router=="/index.html"){//判断路由的不同,读取不同的页面给用户看fs.readFile("./public/html/index.html",(err,buf)=>{res.end(buf);//res.end只能用一次})}})
    

**强调:一切的src和href都是一个请求都是一个路由,这个请求就需要后端来解析,根据不同的请求响应不同的内容

  • 自定义模块

      1、文件模块:创建xx.js去公开需要公开的内容,主模块要引入,必须写为require("./模块名");
      2、目录模块:3种用法1、比如创建m1的文件夹,在其中创建index.js的文件,去公开需要公开的内容,主模块要引入,必须写为require("./m1");
    
  • 下载第三方模块:npm工具:Node Package Manager:Node.js的模块/包管理器,专门用于管理第三方模块的,作用:下载、更新、删除、维护包之间的依赖关系

mongo

mongo就是基于json的数据库。下载,启动在bin文件夹打开cmd:输入.\mongod.exe --dbpath=保存的绝对文件夹路径--服务器开启成功,这个文件夹就保存着以后要存储的所有数据,在bin再打开一个cmd输入.\mongo.exe--在上一个命令可以查看是否连接成功--客服端开启成功。

      1.mongo的语法都是在客户端cmd输入。数据库的操作1.查询所有数据库:show dbs---2.创建\切换数据库:没有就创建,有了就切换use 数据库名称---3.查看当前选中数据库db----4.创建数据表:db.createCollection("表名")---5.db.dropDatabase(),一旦删除不能恢复。数据表的操作,查看目前所有数据表--db.getCollectionNames()---删除数据表db.表名.drop()。
      2.数据的操作:增加:db.表名.save({键值对,...})一次只能插入一条数据;----db.表名.save([{},{}...])一次插入多条数据。----删除:db.表名.remove({name:"张三"}) 会删除数据库中name:张三的所有数据。改:db.表名.update({条件},{$set:{新内容}})----查找:db.表名.find();找所有;db.表名.find({pwd:“123”})找到所有密码为123的数据;--db.表名.find({},{name:1,pwd:1})会找到所以数据但只返回name和pwd;--db.表名.find().sort({age:1}):按照age升序排列,-1为降序排列;--db.bm.find({age:{$get:18}})拿到age大于等于18的数据;--db.表名.find({name:/正则/}) - 甚至可以用正则(模糊查询);--db.表名.find().skip(5).limit(5) - 跳过前5条,再拿5条,理解为5-10条数据(第几个分页条显示第几条数据-第几条数据);--db.表名.find().count() - 获取到此表有多少条数据(分页条)
Node.js操作mongoDB

安装第三方模块:mongoose,使用步骤

 1.引入:const mongoose=require("mongoose")--2.连接数据库mongoose.connect("mongodb://127.0.0.1/数据库名称"),3.创建出一个新的数据表的同时,设置数据类型的控制,防止用户乱输const UserSchema=mongoose.Schema({name: String,age: Number,pwd: String,email: String,//注意这个顺序})  //创建新的数据表var User=mongoose.mode("User",UserSchema,"数据表名")依次是模型名,类型限制,数据表名;4.增:var x=new User({//只是创建出了一个x对象,并没有放入到数据库之中name:"张三",age: 18,pwd:"1234",email: "123@qq.com" })---x.save((err)=>{console.log("新增成功后要干什么")});--5、删:User.remove/deleteOne/deleteMany({条件},(err)=>{// - 作者不推荐remove在mongoose之中使用--6、改:User.update/updateOne/updateMany({条件},{新内容},(err)=>{// - 作者不推荐update在mongoose之中使用console.log("修改成功后要干什么");})--查:User.find({条件},(err,result)=>{result 就是查找的结果)

*form表单,action属性可以自定义一个路由名称,后端解析此路径就可以通过objUrl.query.键名得到相要部分。