1.let和const关键字
let :声明的变量只在 let 命令所在的代码块内有效。
const: 声明一个只读的常量,一旦声明,常量的值就不能改变。 一旦声明必须初始化,否则会报错。
特点:
- let 是在代码块内有效,var 是在全局范围内有效;
- let 只能声明一次 var 可以声明多次 ;( for 循环计数器很适合用 let )
- 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.函数
函数参数的扩展
- 默认参数
注意:function fn(name,age=17){ console.log(name+","+age); } fn("Amy",18); // Amy,18 fn("Amy",""); // Amy, fn("Amy"); // Amy,17- 使用函数默认参数时,不允许有同名参数。
- 只有在未传递参数,或者参数为 undefined 时,才会使用默认参数,null 值被认为是有效的值传递。
- 不定参数
不定参数用来表示不确定参数个数:(…变量名,由…加上一个具名参数标识符组成)。
具名参数只能放在参数组的最后,并且有且只有一个不定参数。
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
注意:
- 有且只有一个参数时,小括号可以省略 。 当箭头函数没有参数或者有多个参数,要用 小括号括起来。
- 当箭头函数函数体有多行语句,用 {} 包裹起来,表示代码块,当只有一行语句,并且需要返回结果时,可以省略 {} , 结果会自动返回。
- 当箭头函数要返回对象的时候,为了区分于代码块,要用 () 将对象包裹起来 。
var f = (id,name) => ({id: id, name: name}); f(1,"tom"); // {id: 6, name: "tom"} - 箭头函数没有自己的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方法
- 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
- find方法用于查找第一个符合条件的元素,如果没有返回undefined。
- findIndex方法用于查找第一个符合条件的元素的位置,如果没有返回-1。
[1, -1, -2, 5].find((n) => n < 0)// -1 [1, 6, 10, 11].findIndex((value, index, arr) =>{ return value > 9; })//2 - includes方法用于判断是否包含指定的值,返回值为布尔类型。
如果有两个参数,第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度,则会重置为从0开始。[1, 2, 3].includes(2) // true [1, 2, 3].includes(3, 3); // false [1, 2, 3].includes(3, -1); // true
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}?`);

注意:
- 如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
- 使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。
- 板字符串中嵌入变量,需要将变量名写在
${}之中。 - 模板字符串之中还能调用函数。
6. 对象
对象的简单表示法
const name = "张三";
const age= 1;
//对象
const student ={
name,
age,
say(){
console.log("say");
}
}
console.log(student);
console.log(student.name);
student.say();

注:
- ES6允许用表达式作为属性名,但是一定要将表达式放在方括号内。
- 属性的简洁表示法和属性名表达式不能同时使用,否则会报错。
super 关键字
ES6 又新增了关键字super,指向当前对象的原型对象。
const person={
name:"张三"
}
const student = {
fun(){
console.log(super.name)
}
}
//为现有对象设置原型
Object.setPrototypeOf(student, person);
student.fun();

注意:super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。
方法
- Object.is方法用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。 不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
console.log(Object.is(-1,1)); console.log(Object.is("tom","tom")); console.log(Object.is(NaN,NaN)); - 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);

注:
- Object.assign()方法的第一个参数是目标对象,后面的参数都是源对象。
- 如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
- 如果只有一个参数,Object.assign()会直接返回该参数。
- 如果该参数不是对象,则会先转成对象,然后返回。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方法回调函数的参数。