超详细的ES6学习笔记

1.let和const关键字

let :声明的变量只在 let 命令所在的代码块内有效。
const: 声明一个只读的常量,一旦声明,常量的值就不能改变。 一旦声明必须初始化,否则会报错。
特点:

  1. let 是在代码块内有效,var 是在全局范围内有效;
  2. let 只能声明一次 var 可以声明多次 ;( for 循环计数器很适合用 let )
  3. let 不存在变量提升,var 会变量提升 ;

2.解构赋值

​ ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构 。
解构模型
​ 解构的源:解构赋值表达式的右边部分。
​ 解构的目标:解构赋值表达式的左边部分。

//数组模型解构
//基本
let [a, b, c] = [1, 2, 3]; 
//剩余运算符
let [a, ...b] = [1, 2, 3];
//字符串
let [a, b, c, d, e] = 'hello';
//对象模型的解构
//基本
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
let { baz : foo } = { baz : 'ddd' };
// foo = 'ddd'

3.函数

函数参数的扩展

  1. 默认参数
    function fn(name,age=17){
     console.log(name+","+age);
    }
    fn("Amy",18);  // Amy,18
    fn("Amy","");  // Amy,
    fn("Amy");     // Amy,17
    
    注意:
    1. 使用函数默认参数时,不允许有同名参数。
    2. 只有在未传递参数,或者参数为 undefined 时,才会使用默认参数,null 值被认为是有效的值传递。
  2. 不定参数
    不定参数用来表示不确定参数个数:(…变量名,由…加上一个具名参数标识符组成)。
    具名参数只能放在参数组的最后,并且有且只有一个不定参数。
 function f(...values){
    console.log(values.length);
 } f(1,2);      
 //2 f(1,2,3,4);  
 //4 

箭头函数

基本语法是:

(参数) => {函数体}

基本用法:

 var f = (a)=>{ return a; }; //等价于 var f = function(a){ return a; } 
 f(1);  //1 

注意:

  1. 有且只有一个参数时,小括号可以省略 。 当箭头函数没有参数或者有多个参数,要用 小括号括起来。
  2. 当箭头函数函数体有多行语句,用 {} 包裹起来,表示代码块,当只有一行语句,并且需要返回结果时,可以省略 {} , 结果会自动返回。
  3. 当箭头函数要返回对象的时候,为了区分于代码块,要用 () 将对象包裹起来 。
    var f = (id,name) => ({id: id, name: name});
    f(1,"tom");  // {id: 6, name: "tom"}
    
  4. 箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象) 。 箭头函数可以方便地让我们在 setTimeout ,setInterval中方便的使用this 。

4.数组

扩展运算符

扩展运算符是三个点(…) ,可以将数组拆分成以逗号分隔的参数序列。

let arr = [1,5,6,4];
console.log(...arr)
// 1 5 6 4
//扩展运算符的应用:合并数组
//第一种方式
let arr1 = [1,5,6,4];
let arr2=[0,5,8,10];
let arr3 = [...arr1,...arr2]
console.log(arr3);
//第二种方式
arr1.push(...arr2)
console.log(arr1);

在这里插入图片描述

//将伪数组转换为真正的数组
let divs = document.getElementsByTagName('div');
divs = [...divs];

Array方法

  1. Array.from方法用于将 类似数组的对象和可遍历的对象 转为真正的数组 。
let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

实际应用中,常见的类似数组的对象是 DOM 操作返回的 NodeList 集合,以及函数内部的arguments对象。
2. Array.of方法用于将一组值,转换为数组。

Array.of(2, 10, 5) // [2, 10, 5]
Array.of(5).length // 1
  1. find方法用于查找第一个符合条件的元素,如果没有返回undefined。
  2. findIndex方法用于查找第一个符合条件的元素的位置,如果没有返回-1。
    [1, -1, -2, 5].find((n) => n < 0)// -1
    
    [1, 6, 10, 11].findIndex((value, index, arr) =>{
    	return value > 9;
    })//2
    
  3. includes方法用于判断是否包含指定的值,返回值为布尔类型。
    [1, 2, 3].includes(2) // true
    [1, 2, 3].includes(3, 3);  // false
    [1, 2, 3].includes(3, -1); // true
    
    如果有两个参数,第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度,则会重置为从0开始。

5.字符串

扩展方法

includes():返回布尔值,判断是否找到参数字符串。
startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。
repeat():返回新的字符串,表示将字符串重复指定次数返回。
padStart:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
padEnd:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。

let str = "ambow";
console.log(str.includes("ow"));
console.log(str.startsWith("a"));
console.log(str.endsWith("w"));
console.log(str.repeat(2));
console.log(str.padStart(7,"山东"));
console.log(str.padEnd(7,"山东"));

在这里插入图片描述

字符串模板

模板字符串是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

// 普通字符串
console.log(`hello`);		
// 多行字符串	
console.log(`text line 1
text line 2`);			
// 字符串中嵌入变量
let name = "Tom", time = "today";
console.log(`Hello ${name}, how are you ${time}?`);

在这里插入图片描述
注意:

  1. 如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
  2. 使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。
  3. 板字符串中嵌入变量,需要将变量名写在${}之中。
  4. 模板字符串之中还能调用函数。

6. 对象

对象的简单表示法

const name = "张三";
const age= 1;
//对象
const student ={
	name,
	age,
	say(){
		console.log("say");
	}
}
console.log(student);
console.log(student.name);
student.say();

在这里插入图片描述
注:

  1. ES6允许用表达式作为属性名,但是一定要将表达式放在方括号内。
  2. 属性的简洁表示法和属性名表达式不能同时使用,否则会报错。

super 关键字

ES6 又新增了关键字super,指向当前对象的原型对象。

const person={
	name:"张三"
}
const student = {
	fun(){
		console.log(super.name)
	}
}
//为现有对象设置原型
Object.setPrototypeOf(student, person);
student.fun();

在这里插入图片描述
注意:super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。

方法

  1. Object.is方法用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。 不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
    console.log(Object.is(-1,1));
    console.log(Object.is("tom","tom"));
    console.log(Object.is(NaN,NaN));
    
  2. Object.assign()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
    const t = { a: 1 };
    const s1 = { b: 2 };
    const s2 = { c: 3 };	
    const s3 = { c: 4};	
    Object.assign(t, s1, s2, s3);
    console.log(t);
    

在这里插入图片描述
注:

  1. Object.assign()方法的第一个参数是目标对象,后面的参数都是源对象。
  2. 如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
  3. 如果只有一个参数,Object.assign()会直接返回该参数。
  4. 如果该参数不是对象,则会先转成对象,然后返回。undefined和null无法转成对象,所以如果它们作为参数,就会报错。

7. Promise 对象

Promise的含义

Promise是异步编程的一种解决方案。 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。

基本用法

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

const promise=new Promise((resolve, reject) => {
	setTimeout(resolve, 1000, 'xxxxx');
});
promise.then((value) => {
	console.log(value);
});

Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。

​ resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

​ reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise.prototype.then()

Promise实例具有then方法,then方法是定义在原型对象Promise.prototype上的。作用是为Promise实例添加状态改变时的回调函数。

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为“成功”时调用,第二个回调函数是Promise对象的状态变为“失败”时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

实例:图片加载

function loadImageAsync(url) {
	return new Promise(function(resolve, reject) {
		const image = new Image();
		image.onload = function() {
			resolve(image);
		};
		image.onerror = function() {
			reject(new Error('无法加载图像:' + url));
		};
		image.src = url;	
	});
}
loadImageAsync('img/1000.jpg').then(function(value) {
	console.log(value);
}, function(error) {
	console.log(error);
});

8.async 函数

基本用法

async 函数,使得异步操作变得更加方便。

async函数返回一个 Promise 对象,可以使用then方法添加回调函数。

let fun1=()=>{
	return new Promise((resolve,reject)=>{
		setTimeout(()=>{
			resolve("4s");
		},4000);
	});
};		
let fun2=()=>{
	return new Promise((resolve,reject)=>{
		setTimeout(()=>{
				resolve("2s");
		},3000);
	});
};
let fun3=()=>{
	return new Promise((resolve,reject)=>{
		throw new Error('出错了');
	});
};	
async function fun(){
	try{
		console.log(await fun1());
		console.log(await fun2());
		console.log(await fun3());
	}catch(e){
		console.log(e)
	}
};		
fun().then((value)=>{
	console.log(value)
});

在这里插入图片描述
async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。

await 关键字仅在 async function 中有效。如果在 async function 函数体外使用 await ,会得到一个语法错误。

async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。

async函数内部return语句返回的值,会成为then方法回调函数的参数。


版权声明:本文为weixin_41092938原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。