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的值为undefined
console.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 区别
// demo5
var 关键字的特点:
- 变量(预解析)提升,可以在声明的前面使用
- 同一作用域内可以多次声明同一个变量(即便这种方式不建议这样去写)
- 能让它形成作用域的只有函数
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 使用默认值2
function 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 方法的简洁表示方法: 省略:function
let 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.setTimout
setTimeout(() => {
// todo
}, 1000)
// 3.promise
let 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.js
const 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); ``` 作业:数组去重