一、什么是 ES6
ES 的全称是 ECMAScript , 它是由 ECMA 国际标准化组织,制定的一项脚本语言的标准化规范。ES6 实际上是一个泛指,泛指 ES2015 及后续的版本。
优点:
变量提升特性增加了程序运行时的不可预测性
语法过于松散,实现相同的功能,不同的人可能会写出不同的代码。
二、ES6 的新增语法
2.1 let
ES6中新增的用于声明变量的关键字。
- 不存在变量提升
console.log(a); // a is not defined
let a = 20
- 暂时性死区
使用let关键字声明的变量具有块级作用域,可以防止循环变量变成全局变量。
if (true) {
let num = 10;
console.log(num); //10
}
console.log(num); //not defined
2.2const
作用:声明常量,常量就是值(内存地址)不能变化的量。
- 具有块级作用域
if (true) {
const a = 10; }
console.log(a) // a is not defined
- 声明常量时必须赋值
const PI; // Missing initializer in const declaration
- 常量赋值后,值不能修改。
const PI = 3.14;
PI = 100; // Assignment to constant variable.
const ary = [100, 200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary); // ['a', 'b']; 数据结构里面的值可以改
ary = ['a', 'b']; // Assignment to constant variable.
2.3 let、const、var 的区别
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可更改 | 值可更改 | 值不可更改 |
2.4 解构赋值
ES6中允许从数组中提取值,按照对应位置,对变量赋值。对象也可以实现解构。
- 数组解构
// 数组解构允许我们按照一一对应的关系从数组中提取值 然后将值赋值给变量
//如果解构不成功,变量的值为undefined。
let [a, b, c, d, e] =[1,2,3];
console.log(a) //1
console.log(b) //2
console.log(c) //3
console.log(d) //undefined
console.log(e) //undefined
- 对象解构
// 对象解构允许我们使用变量的名字匹配对象的属性 匹配成功 将对象属性的值赋值给变量
let person = { name: 'zhangsan', age: 20 };
let { name, age } = person;
console.log(name); // 'zhangsan'
console.log(age); // 20
let {name: myName, age: myAge} = person; // myName myAge 属于别名
console.log(myName); // 'zhangsan'
console.log(myAge); // 20
2.5 箭头函数
ES6中新增的定义函数的方式。
- 语法
(参数) => {函数体}
const fn = () => {}
//函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号
function sum(num1, num2) {
return num1 + num2; }
const sum = (num1, num2) => num1 + num2;
//如果形参只有一个,可以省略小括号
function fn (v) {
return v;
}
const fn = v => v;
- 箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this。
var age = 100;
var obj = {
age: 20,
say: () => {
alert(this.age)
}
}
obj.say(); //alter的是100
2.6 剩余参数
剩余参数和解构配合使用
let students = ['wangwu', 'zhangsan', 'lisi'];
//...s2将剩余的实参归成一个数组
let [s1, ...s2] = students;
console.log(s1); // 'wangwu'
console.log(s2); // ['zhangsan', 'lisi']
利用剩余参数写求和函数
const sum = (...args) => {
let total = 0;
args.forEach(item => total += item);
return total;
};
console.log(sum(10, 20)); //30
console.log(sum(10, 20, 30));//60
三、ES6 的内置对象扩展
- (1) Array 的扩展方法
3.1.1扩展运算符(展开语法)
扩展运算符可以将数组拆分成以逗号分隔的参数序列。
// 扩展运算符可以将数组拆分成以逗号分隔的参数序列
// ...ary 等于 "a", "b", "c"
let ary = ["a", "b", "c"];
console.log(...ary) //a b c
console.log("a", "b", "c") //a b c
//扩展运算符应用于数组合并
let ary1 = [1, 2, 3];
let ary2 = [4, 5, 6];
let ary3 = [...ary1, ...ary2];
console.log(ary3) //[1,2,3,4,5,6]
ary1.push(...ary2); // 合并数组的第二种方法
console.log(ary1) //[1,2,3,4,5,6]
// 利用扩展运算符将伪数组转换为真正的数组
var oDivs = document.getElementsByTagName('div');
var ary = [...oDivs];
3.1.2 构造函数方法:Array.from()
将类数组或可遍历对象转换为真正的数组。
var arrayLike = {
"0": "1",
"1": "2",
"length": 2
}
//将类数组或可遍历对象转换为真正的数组
var ary = Array.from(arrayLike);
console.log(ary) //["1", "2"]
//方法还可以接受第二个参数,用来对每个元素进行处理,将处理后的值放入返回的数组。
var ary = Array.from(arrayLike, item => item * 2)
console.log(ary) //[2, 4]
3.1.3 实例方法:find()
用于找出第一个符合条件的数组成员,如果没有找到返回undefined
var ary = [{
id: 1,
name: '张三'
}, {
id: 2,
name: '李四'
}];
let target1 = ary.find((item, index) => item.id == 2);
console.log(target1); //Object id: 2 name: "李四"
let target2 = ary.find(item => item.id == 3);
console.log(target2);//undefined
3.1.4 实例方法:findIndex()
用于找出第一个符合条件的数组成员的位置,如果没有找到返回-1
let ary = [1, 5, 10, 15];
let index1 = ary.findIndex((value, index) => value > 9);
let index2 = ary.findIndex((value, index) => value > 20);
console.log(index1); // 2
console.log(index2); // -1
3.1.55 实例方法:includes()
表示某个数组是否包含给定的值,返回布尔值。
let ary = ["a", "b", "c"];
let result1 = ary.includes('a')
let result2 = ary.includes('e')
console.log(result1) //true
console.log(result2) //false
- (2)String 的扩展方法
3.2.1 模板字符串
ES6新增的创建字符串的方式,使用反引号定义。
//用反引号定义
let name = `zhangsan`;
优点:
模板字符串中可以解析变量。
模板字符串中可以换行
在模板字符串中可以调用函数。
//模板字符串中可以解析变量
let name = `张三`;
let sayHello = `Hello, 我的名字叫${name}`;
console.log(sayHello); //Hello, 我的名字叫张三
//在模板字符串中可以调用函数
const fn = () => {
return '我是fn函数'
}
let h = `我是模板字符串 ${fn()}`;
console.log(h); //我是模板字符串 我是fn函数
//模板字符串中可以换行
let html = `
<div>
<span>${name}</span>
</div>
`;
console.log(html);
//输出: <div>
// <span>张三</span>
// </div>
3.2.2 实例方法:startsWith() 和 endsWith()
startsWith():表示参数字符串是否在原字符串的头部,返回布尔值
endsWith():表示参数字符串是否在原字符串的尾部,返回布尔值
let str = 'Hello world!';
str.startsWith('Hello') // true
str.endsWith('!') // true
3.2.3 实例方法:repeat()
repeat方法表示将原字符串重复n次,返回一个新字符串。
console.log("y".repeat(5)) //yyyyy
- (3)Set 数据结构
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
3.3.1 语法
Set本身是一个构造函数,用来生成 Set 数据结构。
Set函数可以接受一个数组作为参数,用来初始化。
const s = new Set();
const set = new Set([1, 2, 3, 4, 4]);
3.3.2 实例方法
add(value):添加某个值,返回 Set 结构本身
delete(value):删除某个值,返回一个布尔值,表示删除是否成功
has(value):返回一个布尔值,表示该值是否为 Set 的成员
clear():清除所有成员,没有返回值
const s = new Set();
s.add(1).add(2).add(3); // 向 set 结构中添加值
s.delete(2) // 删除 set 结构中的2值 s.has(1) // 表示 set 结构中是否有1这个值 返回布尔值
s.clear() // 清除 set 结构中的所有值
3.3.3 遍历
Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。
// 遍历set数据结构 从中取值
const s = new Set(['a', 'b']);
s.forEach(value => {
console.log(value) //a b
})