- 首先为啥要学习ES6?
- ES6 的版本变动内容最多,具有里程碑意义;
- ES6 加入许多新的语法特性,编程实现更简单、高效;
- ES6 是前端发展趋势,就业必备技能;
ECMASript 6 新特性
1.let 关键字
let 关键字用来声明变量,使用 let 声明的变量有几个特点:
- 不允许重复声明(let 只能声明一次 var 可以声明多次)
- 块儿级作用域(let 是在代码块内有效,var 是在全局范围内有效)
- 不存在变量提升(let 不存在变量提升,var 会变量提升)
- 不影响作用域链(什么是作用域链:很简单,就是代码块内有代码块,跟常规编程语言一样,上级代码块中的局部变量下级可用)
应用场景:以后声明变量使用 let 就对了
2.const 关键字
const 关键字用来声明常量,const 声明有以下特点:
- 声明必须赋初始值;
- 标识符一般为大写(习惯);
- 不允许重复声明;
- 值不允许修改;
- 块儿级作用域(局部变量); 注意: 对象属性修改和数组元素变化不会出发 const 错误
应用场景:声明对象类型使用 const,非对象类型声明选择 let;
3.解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。
应用场景:频繁使用对象方法、数组元素,就可以使用解构赋值形式
4.模板字符串
模板字符串是增强版的字符串,用反引号(`)标识
字符串中可以出现换行符;也可以使用 ${xxx} 形式引用变量;
//声明字符串的方法:单引号('')、双引号("")、反引号(``)
let string = `我也一个字符串哦`;
console.log(string);
// 2、可以使用 ${xxx} 形式引用变量
let s = "大哥";
let out = `${s}是我最大的榜样!`;
console.log(out);
应用场景:当遇到字符串与变量拼接的情况使用模板字符串;
5.简化对象和函数写法
ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁
//声明变量
let name = "叻叻白";
let change = function() {
console.log("改变自己");
}
//创建对象
const school = {
// 完整写法
// name:name,
// change:change
// 简化写法
name,
change,
//声明方法的简化
say() {
console.log("言行一致")
}
}
school.change();
school.say();
注意:对象简写形式简化了代码,所以以后用简写就对了
6.箭头函数
ES6 允许使用「箭头」(=>)定义函数,箭头函数提供了一种更加简洁的函数书写方式,箭头函数多用于匿名函数的定义
箭头函数的注意点:
- 如果形参只有一个,则小括号可以省略;
- 函数体如果只有一条语句,则花括号可以省略,函数的返回值为该条语句的执行结果;
- 箭头函数 this 指向声明时所在作用域下 this 的值;
- 箭头函数不能作为构造函数实例化;
- 不能使用 arguments;
特性: - 箭头函数的this是静态的,始终指向函数声明时所在作用域下的this的值;
- 不能作为构造实例化对象;
- 不能使用 arguments 变量;
举例:
//一.无参数的传统写法和ES6写法:
var say = function() {
console.log("hellow");
}
say();
//ES6写法:
let speak = () => console.log("hellow11");
speak();
//二.一个参数的传统写法和ES6写法:
var hello = function(name) {
return "hello" + name;
}
console.log(hello("叻叻白"));
//ES6写法:
let hi = name => "hi" + name;
console.log(hi("叻叻白"));
//三.多个参数的传统写法和ES6写法:
var sum = function(a,b,c) {
return a + b + c;
}
console.log(sum(1,2,3));
//ES6写法:
let ho = (a,b,c ) => a + b + c;
console.log(ho(1,2,3));
注意:箭头函数不会更改 this 指向,用来指定回调函数会非常合适
7.rest参数
ES6 引入 rest 参数,用于获取函数的实参,用来代替 arguments
参考文章:www.jianshu.com/p/50bcb376a…
// ES5获取实参的方式
function data() {
console.log(arguments);
}
data("叻叻白","花花","不迟到");
// ES6的rest参数...args,rest参数必须放在最后面
function data(...args) {
console.log(args);
}
data("叻叻白","花花","不迟到");
8.扩展运算符
... 扩展运算符能将数组转换为逗号分隔的参数序列;扩展运算符(spread)也是三个点(...)它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列,对数组进行解包
//声明一个数组 ...
const front = ["叻叻白","花花"];
// 声明一个函数
function programmer() {
console.log(arguments);
}
programmer(...front);
注意:rest 参数非常适合不定个数参数函数的场景
9.Symbol
ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript 语言的第七种数据类型,是一种类似于字符串的数据类型。
参考文章:blog.csdn.net/fesfsefgs/a… Symbol 特点
- Symbol 的值是唯一的,用来解决命名冲突的问题
- Symbol 值不能与其他数据进行运算
- Symbol 定义的对象属性不能使用 for…in 循环遍历,但是可以使用 Reflect.ownKeys 来获取对象的所有键名
注意: 遇到唯一性的场景时要想到 Symbol
10.Symbol内置值
除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行
注意:Symbol内置值的使用,都是作为某个对象类型的属性去使用
11.迭代器
遍历器(Iterator)就是一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作
特性: ES6 创造了一种新的遍历命令 for...of 循环,Iterator 接口主要供 for...of 消费;原生具备 iterator 接口的数据(可用 for of 遍历)
- Array;
- Arguments;
- Set;
- Map;
- String;
- TypedArray;
- NodeList; 工作原理:
- 创建一个指针对象,指向当前数据结构的起始位置;
- 第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员;
- 接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员;
- 每调用 next 方法返回一个包含 value 和 done 属性的对象;
注意:需要自定义遍历数据的时候,要想到迭代器;
//声明一个数组
const Journey = ['唐僧', '孙悟空', '猪八戒', '沙僧'];
//使用for...of遍历数组
for(let v of Journey) {
console.log(v);
}
let iterator = Journey[Symbol.iterator]();
//调用对象的next方法
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
// 重新初始化对象,指针也会重新回到最前面
let iterator1 = Journey[Symbol.iterator]();
console.log(iterator1.next());