javascript-ES6-01

1、模板字符串

出现原因:旧的js字符串拼接使用符号'+',极易使得拼接计算与数学计算混淆

使用方式:特殊符号反引号 `模板字符串`

作用:方便动态拼接字符串

动态内容拼接:使用符号 ${动态代码},在此符号的中代码按照代码运算规则运算;但是使用该符号拼接字符串,该符号中的代码必须有返回值

特点:支持回车换行,在反引号中的字符串支持大多数符号的使用

 

注意:动态内容拼接符号的使用方式在后面的Vue框架工具的学习中还会使用到;该符号中可以使用任何一句话代码,拼接该代码返回的值

 

2、箭头函数

出现原因:旧的函数规则使用函数方法时必须使用 function 定义,比较麻烦。

解决方法:使用箭头函数

使用方法: (参数列表)=>{函数体}

简写规则

  • 如果只有一个参数 可以省略参数列表的()符号
  • 如果函数体只有一句话 可以省略{}符号
  • 如果函数体仅有一句话,且还是return语句 可以省略return
//原函数
function add(a,b){   
    return a+b;
}
//转换为箭头函数
(a,b)=>a+b
//原函数
var arr=[12,123,23,1,3,2];
arr.sort(function(a,b){return a-b});
//转换箭头函数
var arr=[12,123,23,1,3,2];
arr.sort((a,b)=>a-b);

3、箭头函数与this

特点:箭头函数的this与上层this的对象保持一致
         1)、如果函数外层根本没有this或者希望内外this保持一致 使用箭头函数

         2)、相反,必须使用function定义函数

4、ES6对象中函数简写方式

问题?:如果用箭头函数简写对象方法,方法中的this->对象外的this,而不指当前对象本身——错误

解决: ES6中为对象的方法准备了一种专门的简写格式:

对象:{
                   ... : ... ,

                   方法名(){
           this->将来调用这个函数的.前的对象

       }
 }

省略function字符
 

1. obj.fun()  this->点前的obj对象

2. fun()  this->默认指window

3. new Fun()   this->new正在创建的新对象

    类型名.prototype.共有方法=function(){ ... }

    this->将来谁调用这个函数,就指谁

4.将来调用这个函数的.前的某个子对象

5、访问器属性中的this->当前访问器属性所在的对象

 

5、let字符定义变量

问题:var声明变量的问题-变量提升-全局变量-破坏了函数的执行顺序,全局变量超出当前块级作用域

注意:js程序中作用域只有两个,分别是全局作用域,和函数作用域;函数作用域标志是{}但是注意的是该标志仅在函数后面才表示作用域,在函数中代码块中的{}并不表示作用域;也就是说与java等语言的区别是没有块级作用域

使用:let 变量名 (使用方法与var一致)

区别
         1)、使用let定义的变量不会有变量提升

         2)、使用let定义变量在函数代码块的{}中不会出现提升,在外部无法访问,形成了另类的js中的块级作用域

注意:在使用for循环中,对于变量的定义不要使用let而需要使用var变量(因为let自身的特点循环中的每一次都是重新定义的let变量,所以使用var更好)

6、let的底层原理与特点

原理:let的原理相当于是底层的函数自调用

特点
         1)、不允许在定义钱提前使用该定义的变量

         2)、不允许在相同的作用域中重复声明两个相同的let变量

         3)、即使是在全局作用域中定义的let变量也不是全局变量

 

7、循环遍历方式(for of)

遍历索引数组或者遍历数组的方式

方式
         1、普通使用for循环----语法固定无法简化

         2、使用for in循环----不仅遍历数组中的数字下标,还会沿原型链遍历到父对象中的可用属性----超范围

         3、forEach----是数组类型原型对象中的方法,仅限于数组类型的子对象访问。类数组对象无法使用

         4、for of循环----今后只要遍历索引数组或类数组对象,都可用for of循环代替其他遍历方式

 

使用方式


for(var 变量of索引数组或类数组对象){
         of会自动遍历索引数组或类数组对象中每个数字下标对应的元素值,自动保存
         到of前的变量中。
}

 

优点
         数组,类数组,索引数组都可以使用for of循环遍历

 

         使用for of遍历获取的直接就是获取值

缺点
         只能获取遍历的值而无法获取下标

         遍历方式只能是从头到尾遍历无法改变遍历方向与步调

总结:


8、参数增强-参数默认值

问题:传统的函数参数列表中设置参数,然后函数体中才参数进行操作放回结果值;但是用户并不全是正经用户,用户可能会传参可能不会传参,又或者传递超量参数

解决:设置参数默认值(用传参-使用用户参数,未进行传参-使用默认值,保证函数不会因为undefined报错)

使用
         定义方式:function 函数名(形参1=默认值1,形参2=默认值2,...)   ;

局限性:当一个函数有多个参数,用户传参是传递该中间参数的,收尾参数并未传参,这是参数的传递在函数中是按照形参顺序传递的会出现传参错误

解决:使用对象传参方式 {给点形参:对应实参}

9、参数增强-剩余参数

问题:不正经用户超量传参;原本的function定义的函数中系统自带参数列表arguments,但是在箭头函数中在ES6规则下arguments参数列表被作废!!

解决:使用剩余参数法解决多余参数的处理

使用:在参数列表中定义一个数组名,使用剩余参数法收集多余传参,传递到数组中
         定义方法:
                   (agru1,agru2,...argus)=>{函数体}

                   function 函数名(argu1,argu2,...argus){函数体}

注意:使用时 ...argus 表示收集到数组argus,这里的 ... 表示收集符号

优点
         ...argus创建的是一个纯正的数组,可以使用数组对象的所有方法

         收集法创建的数组是收集多余的参数,对已经定义的形参不会抢夺收集其传递对应的实参

 

10、打撒数组spread

问题:一个函数有多个形参,参数传递将实参放在一个数组中传递,需要先打散数组,在对应一一传递参数

解决方法
         旧方式一,使用代码获取数组元素一一传递

         旧方式二,使用apply临时更换this指向

         新方式:打散数组  ...数组

使用方式
         调用函数(...传递数组)

区分收集与打散:收集符号定义在形参列表,打散符号定义在调用时参数列表

11、打散-实用小技巧

复制数组:var arr2=[...arr1]

         先打散arr1,创建arr2然后收集到arr2

拼接数组 var arr3=[...arr1,1000,...arr2]

         创建arr3收集打散的arr1和arr2还有指定的元素

克隆对象 var object={...obj1}

         打散obj1,创建obj收集打散的值

拼接对象 var obj2={...obj1,属性:value}

12、解构destruct

问题:在大型项目中,一个对象或一个数组中的成员可能会非常多。而我们在使用时,一次可能只使用众多成员中的个别成员而已。如果每次在访问对象或数组成员时,都需要加"对象名."或"数组名[i]"就很麻烦!

作用:快速获取对象中指定的属性成员

数组解构

var arr=[2021, 5, 6, 17, 58];
var    [     , m, d]=arr;
console.log(`今天是${m}月${d}日`);

 

对象解构

var user={

      uname:"丁丁",

      age:11,

      sex:1,

      login(){console.log("登录...")},

      logout(){console.log("注销...")},

      changePwd(){console.log("修改密码...")}

}

// var {uname:uname, logout:logout}=user;

var {uname, logout}=user;

console.log(`Welcome ${uname}`);

 

参数解构

参数解构就是之前上文讲过的的对象传参

 

定义函数:

function 函数名({

配对接实参值
属性名1:形参1,
属性名2:形参2,
 ... : ...

}){     函数体;    }

调用函数:

函数名({

属性名1: 实参1,
属性名2:实参2,
                   ... : ...
})

 

13、class类

问题:旧的方式定义一个类,需要定义构造函数+原型对象,但是这种方法时分离的不符合封装要求

解决:要创建一个类型只需要使用class{}方式包含构造函数+原型对象方法

什么是:集中存储一个类型的构造函数和原型对象方法的程序结构。

个人理解:class与Java中的类基本相似,包含构造函数与对象方法

构造函数:构造函数使用constructor定义

class Student{

   //构造函数

   constructor(sname,sage){

      this.sname=sname;

      this.sage=sage;

   }

   //自动放入原型对象中保存

   intr(){

     console.log(`I'm ${this.sname}, I'm ${this.sage}`);

   }

}

var lilei=new Student("Li Lei",11);

14、class继承方法extends

作用:避免代码重复

特点:单线继承,每个class只能继承一个class

符号extends(表示扩展)

使用方法

    1)、定义一个父级类class,封装所有的可以重复使用的代码

    2)、定义子类class,使用extends继承父class

    3)、子类可以定义自己的属性,方法;子类构造函数中使用super(参数列表)获取父类的构造函数

 

class animal{

              constructor(name,age){

                            this.name=name;

                            this.age=age;

              }

              paoxiao(){

              console.log(`${this.name}正在咆哮`);

              }

}

class xiaoniao extends animal{

              construtor(name,age,fly){

                            super(name,age);

                            this.fly=fly;

              }

              fly(){

              console.log(`${this.name}正在${this.fly}`);

              }

}

 

 
  

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值