https://es6.ruanyifeng.com/#docs/destructuring
1)let 和const
- let和const(const 在声明变量的时候必须得有初始值)
- 声明的变量不会进行变量提升
- 在同一个作用域,不允许变量重名
- 有块级作用域的概念
- 暂时性死区
console.log(a); //Cannot access 'a' before initialization
let a;
报错:Identifier ‘a’ has already been declared;(标识a已经被声明过了)let a=3; let a=4;
但是这个不会被报错,在不同的作用域中,可以重名
let a=5;
{
let a=3;
console.log(a);
}
console.log(a)
let a=3;
{
let a=4;
console.log(a);
}
console.log(a);
在es5中 用typeof 检测一个没有声明过的变量,不会报错,而会得到一个“undefined”,在es6中,用typeof 检测的时候 会直接报错,因为有了暂时性死区的概念
typeof a;
let a=3;
2)解构赋值
1)数组的解构赋值
- 要求左右的结构和顺序保持一致
- 如果只需要取个别项,我们不需要的项,也需要用逗号进行占位
- 如果右边没有对应的值,获取的结果就是undefined
我们也可以进行默认赋值
let [a,b,c]=[1,2,3]; console.log(a,b,c);
let [a,[b,c],d]=[1,[2,3],4]
let [a,,c=10]=[4,5]
let a=1,b=2; [a,b]=[b,a]; //交换a和b的值 a的值给b b的值给a console.log(a); console.log(b);
2)对象的解构赋值
解构的时候是按照属性名进行的,所以属性名得保持一致,如果后面想改也可以起别名
如果没有此属性,对应的值就是undefined
- 也可以用等号赋默认值,如果右边绝对等于undefined,那就走默认值。(=) ``` let {age=10}={name:”li”};
- 解构出来的值,不想用原有的属性名字,可以起一个别名。(用:)
let {name:a,age}={name:”li”,age:10}
- 如果属性名和属性值相同,可以省去一个
function fn(){}; let obj={ fn }
<a name="3ZUii"></a>
#### 3)函数的参数解构赋值
function fn([x=10,y=12]){ console.log(x,y)
}
fn([1,2])
```
function fn(x=10,y=12){
console.log(x,y)
}
fn()
3)展开运算符(剩余运算符)
1)展开运算符【形参】
想要拼接数组
var ary1=[1,2,3];
var ary2=[4,5,6];
var ary3=ary1.concat(ary2);
//==========>想要实现数组的拼接,还可以用扩展运算符
var ary4=[...ary1,...ary2]
想要拼接对象
var obj1={name:"li"}
var obj2={age:10}
var obj3=Object.assign(obj1,obj2)
console.log(obj3);//{name: "li", age: 10}
//=============还可以
var obj={...obj1,...obj2};
console.log(Math.max(...arr));//展开运算符
2)剩余运算符【实参的时候】
function fn(...arg){
console.log(arg);//[1,2,3]; 把剩余的值放到数组中装起来
}
fn(1,2,3)
//c拿数组第一项,剩余的所有项都放在数组里给d
let arr=[1,2,3];
let [c,...d]=arr; //剩余运算符
console.log(c,d);//1,[2,3]
4)箭头函数
- 箭头函数,如果返回值是一个对象,简写的时候,需要加一个小括号,不然返回值不是此对象,而是undefined
- 箭头函数中没有this,如果用了this,会按照作用域链进行查找
- 箭头函数中也没有arguments,不过我们可以用剩余运算符
var fn=(x)=>({name:"li"})
5)类
箭头函数不能当成构造函数
let B=()=>{console.log(1)}; //B is not a constructor
let f=new B();
// function fn(x,y){
// this.x=100;
// this.y="y";
// }
// fn.prototype.getX=function(){
// return "getX"
// }
// fn.mm="mm";
class fn{
constructor(x,y){
this.x=100;
this.y="y";
}
getX(){
return "getX"
}
static mm="mm";
}
var f1=new fn(1,2);
console.log(f1);
//fn(); 类不能当成普通函数运行 Class constructor fn cannot be invoked without 'new'
类的继承
class A{
constructor(x,y){
console.log("a--"+x)
this.x=100;
}
getX(){
console.log("gex");
}
static a=200;
static b=200;
y="y";
}
var a=new A();
class B extends A{
constructor(a){
//super(); 用在构造函数中,必须在使用this之前调用 用来访问父对象的函数
super(100);// 相当于call继承
this.f=a
}
getZ(){
console.log("z")
}
ss(){
super.getX();//super 还可以调用A类原型上的方法
}
}
let b=new B(1);
6)Set 数据结构
Set 是一个内置类,是一种数据结构,不是数据类型,和数组类似。
Set 实例中的每项,不允许重复,(在识别重复的时候,不能进行数据转换,”1”和1 认为是不重复项)
Set()里面的参数可以是:
- 数组
- 类数组
- 字符串 ``` var a=new Set([4,5,6]); console.log(a);//{4,5,6};
var a=new Set(“abcd”); console.log(a);//{“a”,”b”,”c”,”d”};
利用Set不重复项的特点,可以完成数组去重
var ary=[1,2,1,1,1,3]; var a=new Set(ary);//{1,2,3} var a=[…a];
Set 原型上的一些方法:
- add 添加项
- delete 删除
- clear 清空
- has(a);
var a=new Set([1,2,3]); a.add(8); console.log(a);//{1,2,3,8}; a.has(2);//返回值是布尔,有的话,返回true,没有返回false a.delete(“2”);//返回值是布尔,true代表删除掉 a.clear();//删除所有项;//{}
数组<br />1)Array of (1,2,3);//把一组数转为数组
var ary=[1,2,1,1,1] var ary2=Array.of(…new Set(ary))
2)Array from() 把类数组转为数组
var ary=Array.from(new Set([1,2,3]));
<a name="z11rm"></a>
### 7) ES6新增 普通对象 如果属性名和属性值的变量名字相同,我们可以像以下这样简写👇
```javascript
const fn=function fn(){
console.log(this);
}
let obj={
name:"OBG",
//fn:fn;//
fn
}
如果对象的属性是一个函数可以这样简写👇
// let obj={
// fn:function(){
// console.log("哈哈");
// }
// }
// obj.fn();
// 简写方式
let obj={
fn(){
console.log("哈哈");
}
}
obj.fn();