12-es6新特性

255 阅读7分钟

1.模板字符串

1.1什么是: 支持换行、动态拼接内容的特殊字符串格式

1.2为什么: 旧js中,拼接字符串只能用+,极容易和算术计算的+法计算混淆

1.3何时: 今后,只要拼接字符串,一律改为用模板字符串

1.4如何: 3句话

  • 整个字符串用一对儿反引号(ESC键正下方的键)包裹
  • 在反引号中可以写单引号,双引号,换行等
  • 在反引号中凡是动态拼接的变量或js表达式都要放在${}中。

1.5${}里:

  • 可以放: 变量、算术计算、三目、对象属性、创建对象、调用函数、访问数组元素——有返回值的合法的js表达式
  • 不能放: 没有返回值的js表达式,也不能放分支、循环等程序结构。比如: if else for while...等

模板字符串.jpg

2.let

问题: var的两个问题:

  • 会被声明提前——打乱程序正常的执行顺序

  • 没有块级作用域——代码块内的变量会超出代码块的范围,影响外部的变量

let1.jpg

let2s.jpg

块级作用域: 指除了对象{}和function的{}之外,其余if else、for、等程序结构的{}范围,在其他语言中称为块级作用域。但是,在js中这些{},都不是作用域。拦不住内部的局部变量声明被提前。

解决: 今后,只要声明变量,都推荐使用let代替var。

优点: 2个:

  • 不会被声明提前——保证程序顺序执行
  • 让程序块,也变成了块级作用域。——保证块内的变量,不会影响块外的变量。

let本质: 底层会被翻译为匿名函数自调

let的三个小脾气:

  • 因为不会声明提前,所以不能在声明变量之前,提前使用该变量。
  • 在相同作用域内,禁止声明两个同名的变量!
  • 因为let底层相当于匿名函数自调,所以,即使在全局创建的let变量,在window中也找不到!

let3.jpg

let4.jpg

3.箭头函数:

什么是: 对绝大多数匿名函数的简写

为什么: 反复写function,很繁琐

何时: 今后几乎所有匿名函数都可用箭头函数简化

如何: 3句话:

  • 去掉function,在()和{}之间加=>

  • 如果只有一个形参,则可以省略()

  • 如果函数体只有一句话,则可以省略{}

    如果函数体仅剩的一句话还是return,则必须去掉return

箭头.jpg

4.箭头函数与this

箭头函数可让函数内的this与函数外的this保持一致!

所以:

  • 今后,如果函数中就不包含this,或刚好希望函数内的this与外部this保持一致时,就可以改为箭头函数

  • 今后,如果反而不希望函数内的this与函数外的this保持一致时,都不能改为箭头函数。

    比如: 对象中的方法就不能改为箭头函数。

    解决: ES6中为对象的方法定义提供了一种专门的不带function的简写。

    如何:

    var 对象名={
     属性名: 属性值, 
     方法名(){ ...  this.属性名 ... }
    }

强调: 既不带:function,又不要加=>。

好处: 既省略了function,但是又不等同于箭头函数,不会影响内部的this!

箭头2.jpg

箭头1.jpg

箭头3.jpg

“箭头函数没有/不是作用域”

错误!

箭头函数只让this,指向外部作用域的this

而箭头函数内的局部变量,依然只能在箭头函数内使用。出了箭头函数不能使用!

所以,箭头函数依然是作用域!只不过影响this而已!不影响局部变量

箭头函数_this底层原理

箭头4.jpg

箭头5.jpg

箭头6.jpg

5.for of

问题: 遍历数字下标的数组或类数组对象

普通for循环:

  • 优点: 既可遍历索引数组,又可以遍历类数组对象(arguments)
  • 缺点: 没有可简化的空间

forEach:

  • 优点: 可以配合ES6的箭头函数,很简化
  • 缺点: 无法用于遍历类数组对象

解决: 今后只要遍历数字下标的东西,都可用for of代理普通for循环和forEach

如何:

 for(var 变量  of 索引数组/类数组对象){
   //of会依次取出数组或类数组对象中每个属性值
   //自动保存of前的变量中
 }

forof.jpg for of的问题:

  • 无法获得下标位置i,只能获得元素值
  • 无法控制遍历的顺序或步调

因为绝大多数循环,都是从头到尾,一个挨一个遍历的,且绝大多数循环不太关心下标位置,只关心元素值,所以for of将来用的还是非常多的!

for.jpg

6.参数默认值(default):

什么是: 调用函数时,即使不传入实参值,形参变量也有默认值可用,不至于是undefined。

何时: 今后,只要希望即使不传入实参值时,形参变量也有默认值使用时

如何: 定义函数时:

  function 函数名(形参1=默认值1, 形参2=默认值2, ...){
   //调用函数时,给形参传了实参值,则首选用户传入的实参值。如果没有给形参传是实参值,则形参默认启用=右边的默认值。
  }

参数默认值1.jpg 问题: 参数默认值不支持,只更换中间某个参数,其余参数保持默认的情况。(后面解构参数解决)

参数默认值2.jpg

7.剩余参数:

定义函数时: 只要多个形参不确定,都用剩余参数

function 函数名(其它形参, ...数组名){
 //...收集除其它形参外多余的实参值保存到指定数组名的数组中
}

多个形参不确定,又想用箭头函数

rest.jpg

…arr返回的是纯正的数组,arr可以使用数组类型的所有好用的函数

rest1.jpg

定义函数时

rest2.jpg

优点:

  • 支持箭头函数
  • 生成的数组是纯正的数组类型,所以使用数组家所有函数
  • 自定义数组名arr,比arguments简单的多!

总结:只要箭头函数中,不确定实参值个数时,都可用”…数组名”代替arguments接住所有或剩余实参值。

8.展开运算符(spread)

打散数组: 今后调用函数时,只要单纯打散数组再传参时

spead1.jpg

spead2.jpg

定义函数时...表示收集

调用函数时...表示打散

9.解构

问题: 旧js中,要想使用对象中的成员,或数字中的元素,都必须带着"对象名."或"数组名[]"前缀。但是,实际开发中,对象或数组的嵌套结构可能很深。前缀就可能写很长: "对象名.子对象名.子对象名....",非常麻烦。

解决: 今后,遇到一个复杂的对象或数组时,都可以通过解构方式,来减少数组或对象的嵌套结构便于使用。

如何: 3种:

9.1数组解构:

解构1.jpg

9.2对象解构:

解构2.jpg

9.3参数解构

问题: 单靠参数默认值,无法解决任意一个形参不确定有没有的情况。

解决: 今后只要发现任意一个实参值都可能没有,但是又要求实参值必须传给指定的形参,顺序不能乱,都可用参数解构:

如何: 2步:

定义函数时:

function 函数名({
	//配对儿 : 接实参值
	属性名1: 形参1, 
	属性名2: 形参2, 
	... : ...
}){
	函数体
}

调用函数时:

   函数名({
   //配对儿
    属性名1: 实参值1, 
   属性名2: 实参值2, 
   ... : ...
   })

简写: 定义函数时,形参列表中,属性名和形参名起相同名字,那么,只写一个名字即可

function 函数名({
     //一个名字两用
     //既配对儿
     //又接实参值
	属性名1=默认值1,
	属性名2=默认值2,
}){
		函数体
}

//调用时:
     函数名({
     //配对儿
      属性名1: 实参值1, 
      属性名2: 实参值2, 
      ... : ...
     })

解构3.jpg