1.模板字符串
1.1什么是: 支持换行、动态拼接内容的特殊字符串格式
1.2为什么: 旧js中,拼接字符串只能用+,极容易和算术计算的+法计算混淆
1.3何时: 今后,只要拼接字符串,一律改为用模板字符串
1.4如何: 3句话
- 整个字符串用一对儿反引号(ESC键正下方的键)包裹
- 在反引号中可以写单引号,双引号,换行等
- 在反引号中凡是动态拼接的变量或js表达式都要放在${}中。
1.5${}里:
- 可以放: 变量、算术计算、三目、对象属性、创建对象、调用函数、访问数组元素——有返回值的合法的js表达式
- 不能放: 没有返回值的js表达式,也不能放分支、循环等程序结构。比如: if else for while...等
2.let
问题: var的两个问题:
-
会被声明提前——打乱程序正常的执行顺序
-
没有块级作用域——代码块内的变量会超出代码块的范围,影响外部的变量
块级作用域: 指除了对象{}和function的{}之外,其余if else、for、等程序结构的{}范围,在其他语言中称为块级作用域。但是,在js中这些{},都不是作用域。拦不住内部的局部变量声明被提前。
解决: 今后,只要声明变量,都推荐使用let代替var。
优点: 2个:
- 不会被声明提前——保证程序顺序执行
- 让程序块,也变成了块级作用域。——保证块内的变量,不会影响块外的变量。
let本质: 底层会被翻译为匿名函数自调
let的三个小脾气:
- 因为不会声明提前,所以不能在声明变量之前,提前使用该变量。
- 在相同作用域内,禁止声明两个同名的变量!
- 因为let底层相当于匿名函数自调,所以,即使在全局创建的let变量,在window中也找不到!
3.箭头函数:
什么是: 对绝大多数匿名函数的简写
为什么: 反复写function,很繁琐
何时: 今后几乎所有匿名函数都可用箭头函数简化
如何: 3句话:
-
去掉function,在()和{}之间加=>
-
如果只有一个形参,则可以省略()
-
如果函数体只有一句话,则可以省略{}
如果函数体仅剩的一句话还是return,则必须去掉return
4.箭头函数与this
箭头函数可让函数内的this与函数外的this保持一致!
所以:
-
今后,如果函数中就不包含this,或刚好希望函数内的this与外部this保持一致时,就可以改为箭头函数
-
今后,如果反而不希望函数内的this与函数外的this保持一致时,都不能改为箭头函数。
比如: 对象中的方法就不能改为箭头函数。
解决: ES6中为对象的方法定义提供了一种专门的不带function的简写。
如何:
var 对象名={
属性名: 属性值,
方法名(){ ... this.属性名 ... }
}
强调: 既不带:function,又不要加=>。
好处: 既省略了function,但是又不等同于箭头函数,不会影响内部的this!
“箭头函数没有/不是作用域”
错误!
箭头函数只让this,指向外部作用域的this
而箭头函数内的局部变量,依然只能在箭头函数内使用。出了箭头函数不能使用!
所以,箭头函数依然是作用域!只不过影响this而已!不影响局部变量
箭头函数_this底层原理
5.for of
问题: 遍历数字下标的数组或类数组对象
普通for循环:
- 优点: 既可遍历索引数组,又可以遍历类数组对象(arguments)
- 缺点: 没有可简化的空间
forEach:
- 优点: 可以配合ES6的箭头函数,很简化
- 缺点: 无法用于遍历类数组对象
解决: 今后只要遍历数字下标的东西,都可用for of代理普通for循环和forEach
如何:
for(var 变量 of 索引数组/类数组对象){
//of会依次取出数组或类数组对象中每个属性值
//自动保存of前的变量中
}
for of的问题:
- 无法获得下标位置i,只能获得元素值
- 无法控制遍历的顺序或步调
因为绝大多数循环,都是从头到尾,一个挨一个遍历的,且绝大多数循环不太关心下标位置,只关心元素值,所以for of将来用的还是非常多的!
6.参数默认值(default):
什么是: 调用函数时,即使不传入实参值,形参变量也有默认值可用,不至于是undefined。
何时: 今后,只要希望即使不传入实参值时,形参变量也有默认值使用时
如何: 定义函数时:
function 函数名(形参1=默认值1, 形参2=默认值2, ...){
//调用函数时,给形参传了实参值,则首选用户传入的实参值。如果没有给形参传是实参值,则形参默认启用=右边的默认值。
}
问题: 参数默认值不支持,只更换中间某个参数,其余参数保持默认的情况。(后面解构参数解决)
7.剩余参数:
定义函数时: 只要多个形参不确定,都用剩余参数
function 函数名(其它形参, ...数组名){
//...收集除其它形参外多余的实参值保存到指定数组名的数组中
}
多个形参不确定,又想用箭头函数
…arr返回的是纯正的数组,arr可以使用数组类型的所有好用的函数
定义函数时
优点:
- 支持箭头函数
- 生成的数组是纯正的数组类型,所以使用数组家所有函数
- 自定义数组名arr,比arguments简单的多!
总结:只要箭头函数中,不确定实参值个数时,都可用”…数组名”代替arguments接住所有或剩余实参值。
8.展开运算符(spread)
打散数组: 今后调用函数时,只要单纯打散数组再传参时
定义函数时...表示收集
调用函数时...表示打散
9.解构
问题: 旧js中,要想使用对象中的成员,或数字中的元素,都必须带着"对象名."或"数组名[]"前缀。但是,实际开发中,对象或数组的嵌套结构可能很深。前缀就可能写很长: "对象名.子对象名.子对象名....",非常麻烦。
解决: 今后,遇到一个复杂的对象或数组时,都可以通过解构方式,来减少数组或对象的嵌套结构便于使用。
如何: 3种:
9.1数组解构:
9.2对象解构:
9.3参数解构
问题: 单靠参数默认值,无法解决任意一个形参不确定有没有的情况。
解决: 今后只要发现任意一个实参值都可能没有,但是又要求实参值必须传给指定的形参,顺序不能乱,都可用参数解构:
如何: 2步:
定义函数时:
function 函数名({
//配对儿 : 接实参值
属性名1: 形参1,
属性名2: 形参2,
... : ...
}){
函数体
}
调用函数时:
函数名({
//配对儿
属性名1: 实参值1,
属性名2: 实参值2,
... : ...
})
简写: 定义函数时,形参列表中,属性名和形参名起相同名字,那么,只写一个名字即可
function 函数名({
//一个名字两用
//既配对儿
//又接实参值
属性名1=默认值1,
属性名2=默认值2,
}){
函数体
}
//调用时:
函数名({
//配对儿
属性名1: 实参值1,
属性名2: 实参值2,
... : ...
})