ES6
一、let与块级作用域
for(let i=0;i<3;i++){
let i=‘foo’
console.log(i)
}
上述等价于:
let i=0;
if(i<3){
let i=‘foo’
console.log(i)
}
i++;//代码循环三遍
解释:代码可以拆成循环和循环体两个块级作用域在两个作用域中均有自己的变量i互不干扰
二、const 声明常量,如果赋值为obj类的数据,可修改属性,实质是分配地址
三、数组解构与对象解构
1.let a=[1,2,3]
let [d,b,c]=a // d:1,b:2,c:3
let [,,e]=a // e:3
let [v,...re]=a//v:1,re=[2,3]
let [q,w,e,r]=a//r=undefined
解释:1数组结构按照顺序依次复制
2.如果想取某一个值,则只需要在解构的时候定义变量即可
3.数组解构时,如果用剩余运算符...则意味着除了前面的解构赋值外数组中的其他元素形成一个新数组赋值给剩余运算符后的变量
4.数组解构时左侧的长度如果大于数组长度则超出的部分的变量值为undefined
5.如果想给某个变量设置默认值可如下let[f=6,g=7]=a//f=1,g=2,只有在值数组a中没有与f,g对应的数据的时候默认赋值才生效
6.解构的匹配规则:按照位置进行匹配(对象解构按照属性名进行解构)
7.对象解构:例如:let obj={name:'jack',age:12} let {ame}=obj//name='jack'
8.如果解构的时候属性名已经存在例如:const name=‘brown’; const obj= {name:'jack',age:12} ;const {ame}=obj//name='jack'//此时会报错(冲突)解决办法是给结构的值的属性起一个别名例如 const {name:objName}=obj,此时以左侧的name去匹配obj里的属性,但是解析出来的值赋给objName此时仍可添加默认值例如const {name:objName='Lili'}=obj,其中Lili就是默认值
四、模板字符串
1.以反斜杆开头``,例如let name=‘kite’,let msg=hello,${name}
;而{}中可以写表达式或者函数例如 let msg=1=2=${1+2}----${Math.random()}
2.带标签的模板字符串 :const str=tag hello word
其中tag是函数,例如const str=console.log hello word
// [‘hello word’],这是因为console.log作为函数将字母串模板中的
作
为
分
隔
符
如
果
没
有
默
认
是
一
个
只
有
一
个
元
素
的
数
组
例
如
:
c
o
n
s
t
n
a
m
e
=
′
j
a
c
k
′
;
c
o
n
s
t
a
g
e
=
12
;
c
o
n
s
t
r
e
s
u
l
t
=
m
y
t
a
g
‘
h
e
l
l
o
,
{}作为分隔符如果没有默认是一个只有一个元素的数组例如:const name='jack';const age=12;const result=mytag `hello,
作为分隔符如果没有默认是一个只有一个元素的数组例如:constname=′jack′;constage=12;constresult=mytag‘hello,{name}is a ${age} old boy`;function mytag(strings){ console.log(strings)} // [‘hello,’,‘is a’,‘old boy’],同时mytag 也能获取到模板字符串中的变量name和age的值例如:
function mytag(strings,name,age){ console.log(strings,name,age)} // [‘hello,’,‘is a’,‘old boy’] jack 18
而函数的返回值才是模板字符串最后的运算结果,如果函数中return 123,则上述模板字符串的值就是123
五、字符串
- startswidth(endswidth):字符串以XX为开头(结尾)
- includes:字符串中是否含有XX
六、函数及对象
1.函数默认值:
1.形如:function foo(name,age=18){
console.log(name,age)
}
foo(‘jack’)
2.多个参数时,有默认值的参数需写在最后,因为参数时按照次序传入并赋值的
3.剩余参数:function foo(…args){}:所有的参数(除了已经列出来的形参)都被加入到agrs中,args为数组形式
5…也可以用来展开数组例如let a=[1,2,3];console.log(…a)
6.箭头函数:箭头函数不会改变this的指向,此时箭头函数外面的this是啥里面的this就是啥
7.对象字面量属性:计算属性名:对象中用[]包含一个表达式,表达式的值为属性名,这样obj的属性就可以变化了
let obj= {
name:‘hah’,
[Math.random()]:123
}
8.object.assign:使用:object.assign(target,source),用来合并两个对象,并返回target,其中第一个参数也是合并后的对象即返回值,计算结果是将source的属性copy到target中如果两者有重合的则source覆盖target的属性值(即后一个覆盖前一个对象的同一个属性值)可以用来设置默认值
9.object.is,判断两个变量是否相等,
10.proxy的常用操作及解释,可以更好的对数组进行监视
11.class的静态方法:static声明,静态方法中的this指向类而不是实例,类的继承extends:class student extends person{
constructor(){
super()
}
}
12.for of 不可直接遍历对象,
13.promise.all([func1,func2…]),如果他们有返回值返回值会以数组形式返回,[result1,result2…],result1是func1的结果