ES6常用的基础知识点
ES6介绍
阮一峰es6文档地址: https://es6.ruanyifeng.com/
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了也叫ECMAScript 2015。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言
(一) let 命令和const命令
知识点:
- let的用法类似于var,用于变量的声明
- 使用let就会产生块级作用域,let命令只在块级作用域内(也就是大括号内)有效
- let在同一作用域内只能声明一次, 不能重复声明
- let和const不存在变量提升
详细例子:
1. let命令
// 块级作用域demo1.1 -变量只在{}内起作用{var a = 100;let b = 200;}console.log('a', a);console.log('b', b); // 报错// 块级作用域demo1.2 for循环中声明的变量for (let j = 1; j < 10; j++) {// todo}console.log(j); // 报错// demo2 同一个作用域只能声明一次let a = 100;console.log(a);let a = 200; // 报错// demo2.2 下面这样是可以的,因为它们是在不同的作用域内let b=100;{let b=200;}// demo3 let和const不存在变量声明提前console.log(a); // a先声明后赋值, 所以a的值为undefinedconsole.log(b); // 报错,用let声明变量不会提前var a = 100;let b = 200;
2. const命令
// demo4.1 const声明一个只读的常量。一旦声明,常量的值就不能改变, 常量习惯用大写const NUM = 100;NUM = 200;// demo4.2 const命令声明的引用数据类型, 可以添加属性和修改属性, 但不能重新赋值const obj = { a: 2 };obj.a = 100;obj.b = 200;obj = { b: 3 }; // 重新赋值会报错,不允许这样做
3.var、let、const 区别
// demo5var 关键字的特点:- 变量(预解析)提升,可以在声明的前面使用- 同一作用域内可以多次声明同一个变量(即便这种方式不建议这样去写)- 能让它形成作用域的只有函数let:声明变量的关键字- 没有变量提升,只能在声明之后使用- 同一作用域内只能声明一次- 你声明的变量的作用域仅限于最近的花括号内( {} )const:只能用来声明常量,该常量一旦声明其值就不能改变( 与let的唯一区别 )- 没有变量提升,只能在声明之后使用- 同一作用域内只能声明一次- 你声明的变量的作用域仅限于最近的花括号内( {} )- 用const声明的变量: 不允许重新赋值,引用数据类型可以添加或修改属性
(二) 变量的解构赋值
知识点:
- 解构: 结构分解, 从一个整体的变量里分解出一部分来使用
- 数组解构
- 对象解构
- 函数参数解构和默认值
// demo1 数组解构let arr = [1, 2, 3, 4];let [a, b] = arr;console.log('a=', a);console.log('b=', b);// demo2 对象解构let obj = {name: 'zs',age: 20}let { name, age } = obj;console.log('name=', name);console.log('age=', age);// demo3 在函数中使用解构function Cat({ name, age }) {this.name = name;this.age = age;};let cat = new Cat({ name: '小花', age: 2 });console.log(cat);// demo3.2 函数参数使用默认值function Cat({ name = '小白', age = 1 }) {this.name = name;this.age = age;};let cat = new Cat({});console.log(cat);// demo3.3 使用默认值2function get(data = {}) {console.log(url, data);// todo}get();function Cat({ name = '小白', age = 1 } = {}) {this.name = name;this.age = age;};let cat = new Cat();console.log(cat);
(三) 模板字符串
反引号模板字符串let place = "world"// 变量place没有声明let msg = `Hello, ${place}`;${变量},其他的都是常量
(四) 对象的扩展
知识点:
- 属性的简洁表示法
- 方法的简洁表示法
- 变量做属性名
详细例子:
// demo1 属性简洁表示方法:当属性名和属性值相同时可以使用简洁表示方式let username = 'laohu';let age = 100;// 以前的表示方法let obj = {username: username,age: age}// 简洁表示法let obj2 = {username,age,}// demo2 方法的简洁表示方法: 省略:functionlet obj = {say: function() {},say() {}}// demo3 变量做属性名let username = 'zs';let obj = {[username]: 'xxx'}console.log(obj);
(五) 函数的扩展: 箭头函数
知识点
- 箭头函数的常见表达方式
- 箭头函数的this指向: 外面指向哪里,里面指向哪里
- 箭头函数不能做构造函数,箭头函数的arguments对象不可用
详细列子
// 1.箭头函数例子function add(a, b) {return a + b;}// 1.使用箭头函数表达上面的函数let add1 = (a, b) => {return a + b;}// 2.简写方式: 函数体只有一行时let add2 = (a, b) => a + b;// 3.参数只有一个,小括号可以省略function squart(num) {return num * num;}// 简写let squart2 = num => num * num;
// 1.2 箭头函数常见使用场景// 1. 回调函数const list = [1, 2, 3, 4, 5, 6];list.forEach(function(item, index) {// todo});list.forEach((item, index) => {// todo});list.forEach(item => {// todo});// 2.setTimoutsetTimeout(() => {// todo}, 1000)// 3.promiselet promiseObj = new Promise((resolve, reject) => {// todo})promiseObj.then(res => {// todo}).catch(err => {// todo});
// 箭头函数this的指向let obj = {getList() {console.log('this的指向', this);setTimeout(()=> {console.log('setTimout', this);}, 1000);}}obj.getList();
// demo3.html 箭头函数的this指向<!DOCTYPE html><html lang="en"><body><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script><script>let obj = {getList() {console.log('this', this);$.ajax({url: 'http://huruqing.cn:3000/api/film/getList',type: 'get',dataType: 'json',success: (res) => {// this的指向里外一致console.log('this', this);this.render(res.films);}})},render(list) {console.log(list);}}obj.getList();</script></body></html>
(六) 数组的扩展
知识点:
- Array.from() // 将伪数组(类数组)变成真数组
- find()
- findIndex()
- includes()
- keys() // 遍历键, 了解
- values() // 遍历值, 了解
- entries() // 遍历键值对, 了解
详细例子
```javascript function test() { console.log(Array.isArray(arguments)); // arguments是伪数组 console.log(arguments.push); // undefine // 将arguments变成真数组 arguments = Array.from(arguments); console.log(Array.isArray(arguments)); }
test(1, 2, 3, 4, 5);
<a name="E6Hwx"></a>## (七) 扩展运算符 ...<a name="R6sOL"></a>### 知识点:1. 在对象中使用1. 在数组中使用1. 在函数中使用<a name="OsM3m"></a>### 详细例子:```javascript// demo1.1 在对象中使用let obj1 = {name: 'zs',age: 100}let obj2 = {addr: 'gx'}let obj = {...obj1,...obj2}console.log(obj);// demo1.2 在对象中使用:koa合并get请求和post请求参数app.use((ctx,next)=> {ctx.params = {...ctx.query,...ctx.request.body}next();})// demo2 在数组中使用:合并数组let arr1 = [1, 2, 3];let arr2 = [4, 5, 6];let arr = [...arr1,...arr2]console.log(arr);// demo3 在函数中使用function test(a, b, ...c) {console.log(a);console.log(b);console.log(c);}test(1, 2, 3, 4, 5, 6);
(八) Promise
知识点:
- promise定义
- 创建promise对象, 并存储数据
- 获取promise对象的值
- async await
(九) ES6 模块系统
前提条件:
- 安装serve模块 npm i serve -g
-
(1) 常用模块化规范:
commonjs规范 nodejs遵守commonjs规范
- AMD规范 reqire.js遵守AMD规范
- CMD规范 sea.js遵守CMD规范(玉伯, 淘宝)
- ES6规范
(2) ES6模块导出和导入:
1. 导出和导入方式(一)
- export // 导出
import {xx} from xxx // 导出名称是什么, 导入名称也是什么
2. 导出和导入方式(一)
export default // 默认导出
import xx from xx // 导入,可以使用任意名称接收默认导出的变量
3. 重命名
import {aa as xx} from xxx // 导入之后重命名
- import * as xx from xxx // 导入之后重命名
(3) 例子
// demo1 导出方式(一)// demo1.html 使用export导出, 导入的时候,变量名称必须一致<script type="module">import {username,age,PI} from './m1.js';console.log(username);console.log(age);console.log(PI);</script>// m1.js// 导出变量export let username = '张三';export let age = 100;export const PI = 3.1415926535;
// demo2.html<script type="module">import obj from './m2.js';obj.say();</script>// m2.jsconst home = {say() {console.log('哈哈哈哈')},getList() {// todo}}export default home;
// demo3.html 重命名<script type="module">import {age as nianling} from './m1.js';console.log('nianling=',nianling);</script>// demo4.html<script type="module">import * as obj from './m1.js';console.log(obj);</script>
(十) class
声明一个类 ```javascript // 声明一个类 class Person { constructor(name, age) {
this.name = name;this.age = age;
}
say() {
console.log(this.name);
} }
// 创建实例 let p = new Person(‘张三’, 100); console.log(p); p.say();
2. 类继承```javascript// 声明一个类class Person {constructor(name, age) {this.name = name;this.age = age;}say() {console.log(this.name);}}// 声明一个男人的类class Man extends Person {constructor(name, age) {super(name, age);this.sex = '男的';}}let man = new Man('李四', 20);console.log('man', man);man.say();
(十一) 新类型(了解)
map
const map = new Map([['name', '张三'],['title', 'author']]);let name = map.get('name');let title = map.get('title');console.log(name, title);
set
let arr = [5, 1, 2, 2, 2, 3, 2, 6, 7];let set = new Set(arr);console.log('set', set);arr = [...set];console.log('arr', arr);
symble ```javascript // demo3.1 let s1 = Symbol(‘aa’); let s2 = Symbol(‘aa’); console.log(s1 === s2); // false
// demo3.2 let username = Symbol(‘username’); let age = Symbol(‘age’);
let obj1 = { username: ‘张三’, age: 16 }
let obj2 = {
[username]: '张三',[age]: 20
}
let obj = { …obj1, …obj2 } console.log(obj); ``` 作业:数组去重
