三.ES6基础知识一(超详细!!!)

1.变量声明

let 用于声明一个变量

  • 变量不会提升,即在变量声明之前无法使用该变量

  • 不可以重复声明

  • 具有块级作用域,只在当前作用域有效

const 用于声明一个常量

  • 变量声明不会被提升,即在变量声明之前无法使用该变量

  • 不允许重复声明。

  • 具有局部作用域,即const声明的变量只能在对应代码块中使用

  • const声明的变量在声明的时候就需要赋值,并且只能赋值一次,不能修改。

// ES5 var变量声明会提前
console.log(a);
var a = 1;

// ES6 let,const变量声明不会提前,有块级作用域的概念,不允许重复声明
// const声明的变量,声明时就要赋值,而且不允许修改

// 1.变量声明不会提前
// console.log(name);    //报错 1.变量声明不会提前
let name = 'wll';
{
  let name2 = 'cjk';
  console.log('内部',name2,name);
}
console.log('外部',name);

// 2.有块级作用域的概念
for (let i = 1;i<10;i++){
  console.log(i);
}
// console.log(i);  //报错 2.有块级作用域的概念

function myFun(){   //函数有局部作用域
  var age = 12;
  console.log(name);
}
myFun();
// console.log(age); //报错

//3.不允许重复声明
const a = 1;
// const a = true;   //报错  3.不允许重复声明


// 4.const声明的变量,声明时就要赋值,而且不允许修改
//const c;    //报错 const声明的变量声明时就要赋值
const c = 0;
// c++;        //报错 const声明的变量不允许修改

2.数组解构

1)数组的不完全解构

// 数组的不完全解构
let [a,b] = [1,2,3];  //结果 1 2
let [a,b,c] = [1,[2,3],4];
console.log(a,b,c);   //1 [ 2, 3 ] 4
let [a,[b],c] = [1,[2,3],4];
console.log(a,b,c);     //1 2 4

2)集合解构 ...扩展运算符

// 拓展运算符
// ...用在=左边,有聚合的作用,生成新的对象和数组
// ...用在=右边,有拆分、剥离的作用
let [a,...b] = [1,2,3]
console.log(a,b);   // 结果 1 [ 2, 3 ]

3)默认值解构(当匹配值严格等于undefined时,默认值生效)

// 数组解构设置默认值,有的话匹配,没有的话用默认值
let [a,b,c] = [1,2];
console.log(a,b,c);   //结果 1 2 undefined
let [a,b,c=10] = [1,2];
console.log(a,b,c);     //结果  1 2 10
let [a,b,c=10] = [1,2,3];
console.log(a,b,c);     //结果  1 2 3

4)默认值也可以是函数

function myFun(){
  console.log('函数');    //函数没有定义返回值
}
let [a,b,c=myFun()] = [1,2];    //c为myFun函数的返回值return
console.log(a,b,c);     //1 2 undefined

3.对象解构

1)对象解构

使用对象的简写形式,省略了key值,保留了value值对应的变量

等号左边的变量放到大括号内部,匹配右侧对象中的元素。对象的属性没有次序,变量必须与属性同名,才能取到正确的值 ​ 如果变量名和属性名不一致,需要重命名

// 对象解构 使用对象的简写形式,省略了key值,保留了value值对应的变量
let {name,age} = {name:'wll',age:22};   
console.log(name,age);    //wll 22
let {name:username,age:userage} = {name:'wll',age:22};
console.log(username,userage);    //wll 22

2)嵌套解构

一层一层解构,先解构最外层

// 嵌套解构
let obj = {p:['hello',{y:'world'}]};
let {p:[a,{y:b}]} = obj;  //一层一层解构,先解构最外层
console.log(a,b);   //hello world

3)对象解构 设置默认值

默认值生效的条件是,对象的属性值严格等于undefined

// 对象解构 设置默认值
let {name,age,gender} = {name:'wll',age:12};
console.log(name,age,gender);   //wll 12 undefined
let {name,age,gender='female'} = {name:'wll',age:12};
console.log(name,age,gender);     //wll 12 female
let {name,age,gender='female'} = {name:'wll',age:12,gender:'male'};
console.log(name,age,gender);     //wll 12 male

4)对象解构的拓展

// 对象解构的拓展
let {a,...b} = {a:1,b:2,c:3};
console.log(a,b);       //1 { b: 2, c: 3 }
let {...b} = {a:1,b:2,c:3};
console.log(b);           //{ a: 1, b: 2, c: 3 }

5) 对象的深拷贝

开辟了一个新的内存空间

let obj = {a:1,b:2,c:3};
let {...b} = obj;
console.log(b);             //{ a: 1, b: 2, c: 3 }
console.log(obj === b);     //false

6) 经典面试题

const [a, b, c, ...d] = [1, 2, 3, 11, 999];
const { e, f,f1, g, ...h } = { f: 4, g: 5, i: 6, j: 7 };
console.log(a, b, c, d, e, f1, g, h);
//1,2,3,[11,999],undefined,undefined,5,{i: 6, j: 7}

4.字符串解构

1)可以使用数组解构,使用数组结构可以获取指定字符

2)使用对象解构,使用对象结构可以获取实例属性方法

3)字符串转数组(数组解构,拓展运算符)

// 字符串既可以使用数组[]解构,也可以使用对象{}解构
let [a,b,c,d,e] = 'hello';
console.log(a,b,c,d,e);   //h e l l o
let {length,toString} = 'hello';
console.log(length,toString);   //5 [Function: toString]
// 字符串转数组(数组解构,拓展运算符)
let [...arr] = 'hello';
console.log(arr);     //[ 'h', 'e', 'l', 'l', 'o' ]

5.number解构和Boolean解构

1)数字和Boolean只能使用{}解构其原型对象中的方法和属性

2)而不能使用[]解构,因为数字和Boolean是不可迭代的

//数字和Boolean只能使用{}解构其原型对象中的方法和属性
//而不能使用[]解构,因为数字和Boolean是不可迭代的
// let [a,b] = 10;   //报错,数字不迭代
// let [a] = true;     //报错,布尔不迭代

let {valueOf} = 10;
console.log(valueOf);   //[Function: valueOf]

let {valueOf} = true;
console.log(valueOf);     //[Function: valueOf]

6.对象拓展

对象简写

ES6中规定可以直接在对象中写入变量和函数作为对象的属性和方法,此时属性名为变量名, 属性值为变量的值。对象简写在未来的使用频率极其高。

let name='wll';
let age =12;
let obj = {
  name,
  age,
  sayName(){
    console.log(this.name);
  }
}
obj.sayName();		//wll

静态方法

1)Object.is() 比较两个值是否一样

// === 比较两个值是否全等
//1. Object.is() 比较两个值是否一样
console.log(1 === 1);           //true
console.log(Object.is(1,1));    //true
console.log(+0 === -0);           //true
console.log(Object.is(+0,-0));    //false
console.log(NaN === NaN);             //false
console.log(Object.is(NaN,NaN));      //true

2)Object.assign() 深拷贝

//2. Object.assign()    对象的深复制
let obj1 = {};
let obj2 = {name:'cjk',age:12};
let obj3 = {name:'wll',gender:'female'};

//深复制,将obj2复制给obj1,返回值是obj1
Object.assign(obj1,obj2);       
console.log(Object.assign(obj1,obj2)); 	//{ name: 'cjk', age: 12 }
console.log(obj1);		//{ name: 'cjk', age: 12 }
console.log(obj1 === obj2);   //false

 //将obj2和obj3合并之后复制给obj1,若obj2和obj3中有相同的部分,应使用后定义的那部分
Object.assign(obj1,obj2,obj3);   
console.log(obj1);		
//{ name: 'wll', age: 12, gender: 'female' }

3)Object.setPrototypeOf() 设置原型对象中的方法 Object.getPrototypeOf() 获取原型对象中的方法

//3.Object.setPrototypeOf()设置原型对象中的方法
//Object.getPrototypeOf()获取原型对象中的方法
let obj1 = {};
let obj2 = {name:'cjk',age:12};
let obj3 = {name:'wll',gender:'female'};
Object.setPrototypeOf(obj1,obj2);   
console.log(obj1.__proto__);      //{ name: 'cjk', age: 12 }
console.log(obj1.constructor.prototype);      //[Object: null prototype] {}
console.log(Object.getPrototypeOf(obj1));     //{ name: 'cjk', age: 12 }

4)Object.keys() 获取所有属性名组成的数组

Object.values() 获取所有属性值组成的数组

Object.entries() 获取键值对组成的数组

//4.Object.keys() 获取所有属性名组成的数组
//Object.values() 获取所有属性值组成的数组
//Object.entries()  获取键值对组成的数组
let obj1 = {
  name:'wll',
  age:22,
  gender:'female'
}
let keys = Object.keys(obj1);   
let values = Object.values(obj1);
let entries = Object.entries(obj1);
console.log(keys,values,entries);
//[ 'name', 'age', 'gender' ] 
//[ 'wll', 22, 'female' ] 
//[ [ 'name', 'wll' ], [ 'age', 22 ], [ 'gender', 'female' ] ]
entries.forEach((item,index)=>{
  console.log(index,item[0],item[1]);
})
// 0 name wll
// 1 age 22
// 2 gender female

7.拓展运算符

1.在=左边:聚合的作用,返回值和外层包裹的标识符有关系

// ...用在=左边,有聚合的作用,生成新的对象和数组
let [a,...b] = [1,2,3]
console.log(a,b);   // 结果 1 [ 2, 3 ]

let {a,...b} = {a:1,b:2,c:3};
console.log(a,b);       //1 { b: 2, c: 3 }
let {...b} = {a:1,b:2,c:3};
console.log(b);           //{ a: 1, b: 2, c: 3 }

2.在=右边:剥离(展开)的作用,把对象或数组中每个属性或键值对单独

// 拓展运算符用在=右边的,可以剥离出来
let obj1 = {
  name:'wll',
  age:22
}
let obj2 = {
  ...obj1,
  name:'cjk',        
  gender:'female'
}
console.log(obj2);      
 //{ name: 'cjk', age: 22, gender: 'female' }  如果有相同的属性,则后来者居上

let arr1 = ['tom','lerry','jecky'];
let arr2 = [...arr1,'wll','cjk'];   
console.log(arr2);
//[ 'tom', 'lerry', 'jecky', 'wll', 'cjk' ]

3.用在函数形参位置,叫rest参数,相当于在=左边的功能(聚合的作用)

//ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。
// ...用在函数的形参位置,叫做rest参数,也叫拓展运算符的逆运算
let myFun4 = function (a,...b){
  console.log(a,b);
}
myFun4(1,2,3,4,5,6)   //1 [ 2, 3, 4, 5, 6 ]

8.数组API

1)Array.from()

将其他类型数据转换成数组

//1.Array.from()  将其他类型数据转换成数组
// ES5 Array.prototyoe.slice.call('类数组对象',0)
let arrObj = {
  0:'zhangsan',
  1:'lisi',
  2:'terry',
  length:3
}
console.log(Array.from(arrObj));    
//[ 'zhangsan', 'lisi', 'terry' ]
let str = 'hello'
let arr1 = Array.from(str);
console.log(arr1);    //[ 'h', 'e', 'l', 'l', 'o' ]

2)Array.of()

用于将一组值转换为数组。这个的主要目的是弥补数组构造函数Array()的不足

//2.Array.of()  用于将一组值转换为数组。这个的主要目的是弥补数组构造函数Array()的不足。
let arr1 = Array.of(3);
console.log(arr1);      //[ 3 ]

3)Array.prototype.find()

find()方法用于找出第一个符合条件的数组成员。或者undefined

//3.Array.prototype.find()  find()方法用于找出第一个符合条件的数组成员。或者undefined
let arr1 = Array.of(1,2,3,4,5,6);
let result = arr1.find((item,index)=>{
  return item > 2
})
console.log(result);    //3

4)Array.prototype.findIndex()

findIndex()找出第一个符合条件的数组成员的索引。如果所有成员都不符合条件,则返回-1

//4.Array.prototype.findIndex()     //findIndex()找出第一个符合条件的数组成员的位置。如果所有成员都不符合条件,则返回-1.
let arr1 = Array.of(1,2,3,4,5,6);
let result = arr1.findIndex((item,index)=>{
  return item > 2
})
console.log(result);    //2

5)Array.prototype.includes()

该方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。ES6引入了该方法。

//5.Array.prototype.includes()    该方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。ES6引入了该方法。
let arr1 = Array.of(1,2,3,4,5,6);
let result1 = arr1.includes(1);
console.log(result1);		//true

6)Array.prototype.fill()

fill()方法使用给定的值填充一个数组。改变原数组

//6.Array.prototype.fill()  fill()方法使用给定的值填充一个数组。改变原数组
let arr1 = Array.of(1,2,3,4,5,6);
let result2 = arr1.fill(7);			//改变原数组
console.log(result2 === arr1);    	//true

7)遍历

Array.prototype.keys() keys()是对键名的遍历

Array.prototype.values() values()是对属性值的遍历

Array.prototype.entries() entries()是对键值对的遍历。

//7.Array.prototype.keys()    keys()是对键名的遍历
//Array.prototype.values()    values()是对属性值的遍历
//Array.prototype.entries()   entries()是对键值对的遍历。
let arr1 = Array.of(1,2,3,4,5,6);
let keys = arr1.keys();
let values = arr1.values();
let entries = arr1.entries();
console.log(keys,values,entries);   //Object [Array Iterator] {}
console.log(Array.from(keys));    //[ 0, 1, 2, 3, 4, 5 ]
console.log(Array.from(values));  //[ 1, 2, 3, 4, 5, 6 ]
console.log(Array.from(entries));   //[ [ 0, 1 ], [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 4, 5 ], [ 5, 6 ] ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值