https://www.bilibili.com/video/BV1uK411H7on 课程笔记
概述
ECMA(European Computer Manufacturers Association)中文名称为欧洲计算机制造商协会,这个组织的目标是评估、开发和认可电信和计算机标准。1994 年后该组织改名为 Ecma 国际;
ECMAScript 是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言;
百度百科:https://baike.baidu.com/history/ECMAScript/1889420/144946978
Ecma 国际制定了许多标准,而 ECMA-262 只是其中的一个,所有标准列表查看:
http://www.ecma-international.org/publications/standards/Standard.htm
TC39(Technical Committee 39)是推进 ECMAScript 发展的委员会。其会员都是公司(其中主要是浏览器厂商,有苹果、谷歌、微软、因特尔等)。TC39 定期召开会议,会议由会员公司的代表与特邀专家出席;
为什么学习ES6?
- ES6 的版本变动内容最多,具有里程碑意义;
- ES6 加入许多新的语法特性,编程实现更简单、高效;
- ES6 是前端发展趋势,就业必备技能;
ES6
功能概述
1、let 关键字。声明局部变量;
2、const 关键字。声明常量;
3、变量和对象的解构赋值。简化变量声明:;
4、模板字符串。声明自带格式的字符串;
5、简化对象和函数写法。简化对象和函数写法;
6、箭头函数。简化函数写法;
7、ES6中函数参数的默认值。给函数的参数设置默认值;
8、rest参数。拿到实参;
9、扩展运算符。将一个数组转为用逗号分隔的参数序列;
10、Symbol。表示独一无二的值;
11、迭代器。用来遍历集合、数组等;
12、生成器。是一种异步编程解决方案;
13、Promise。非常强大的异步编程的新解决方案;
14、Set集合。类似数组,但元素不重复的集合;
15、Map集合。键值对集合;
16、class类。像java实体类一样声明js类;
17、数值扩展。增加一些数值相关的方法等;
18、对象扩展。增加一些对象相关的方法等;
19、模块化。模块化、组件化;
20、Babel对ES6模块化代码转换。为了适配浏览器,将更新的ES规范转换成ES5规范;
21、ES6模块化引入NPM包。像导入模块一样导入npm包;
let关键字
let 关键字用来声明变量,使用 let 声明的变量有几个特点:
- 不允许重复声明;
- 块儿级作用域(局部变量),只能在代码块中有效
- 不存在变量提升;
- 变量提升:在代码执行之前,函数声明和变量声明会被提前放在内存中,使得我们可以在代码的函数声明之前对函数进行调用,只有声明会被提升,如果一个变量先被使用再被声明和赋值的话,使用时的值是 undefined。
- 不影响作用域链;(向内兼容)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| let a; let b,c,d; let e = 100; let f = 521, g = 'iloveyou', h = [];
let dog = "狗"; let dog = "狗";
for (let i = 0; i < items.length; i++) { items[i].onclick = function() { items[i].style.background = 'pink'; } }
|
以后声明变量能用let都用let
const关键字
const 关键字用来声明常量,const 声明有以下特点:
- 声明必须赋初始值;
- 标识符一般为大写(习惯);
- 不允许重复声明;
- 值不允许修改;
- 块儿级作用域(局部变量);
- 对数组和常量的修改不算对常量的修改,不会报错
- const 常量指向的地址没有变
声明对象类型使用 const,非对象类型声明选择 let;
变量和对象的解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
const F4 = ["大哥","二哥","三哥","四哥"]; let [a,b,c,d] = F4;
console.log(a + b + c + d);
const F3 = { name : "大哥", age : 22, sex : "男", xiaopin : function(){ console.log("我会演小品!"); } } let {name,age,sex,xiaopin} = F3; console.log(name + age + sex + xiaopin); xiaopin();
|
频繁使用对象方法、数组元素,就可以使用解构赋值形式;
模板字符串
模板字符串(template string)是增强版的字符串,用反引号(`)标识,特点:
- 字符串中可以出现换行符(声明和赋值的时候);
- 可以使用 ${xxx} 形式引用变量(变量拼接);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
let string = `我也一个字符串哦!`; console.log(string);
let str = `<ul> <li>大哥</li> <li>二哥</li> <li>三哥</li> <li>四哥</li> </ul>`; console.log(str);
let s = "大哥"; let out = `${s}是我最大的榜样!`;
|
当遇到字符串与变量拼接的情况使用模板字符串;
简化对象和函数写法
ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
let name = "JC"; let change = function(){ console.log("活着就是为了改变世界!"); }
const school = { name, change, say(){ console.log("言行一致!"); } } school.change(); school.say();
|
以后都用简化的写法
箭头函数
ES6允许使用箭头(=>)定义函数,箭头函数提供了一种更加简洁的函数书写方式,箭头函数多用于匿名函数的定义
箭头函数的注意点:
- 如果形参只有一个,则小括号可以省略;
- 函数体如果只有一条语句,则花括号可以省略,此时return关键字必须省略,函数的返回值为该条语句的执行结果;
- 箭头函数 this 指向声明时所在作用域下 this 的值;
- 箭头函数不能作为构造函数实例化;
- 不能使用 arguments;
特性:
- 箭头函数的this是静态的,始终指向函数声明时所在作用域下的this的值;
- 不能作为构造函数实例化对象;
- 不能使用 arguments 变量;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| let speak = () => console.log("hello 哈哈!");
let hi = name => "hi " + name;
let he = (a,b,c) => a + b + c;
const school = { name : "大哥", }
function getName(){ console.log("getName:" + this.name); }
getName1 = () => console.log("getName1:" + this.name); window.name = "JC";
getName(); getName1();
getName.call(school); getName1.call(school);
let Persion = (name,age) => { this.name = name; this.age = age; } let me = new Persion("JC",24); console.log(me);
let fn = () => console.log(arguments); fn(1,2,3);
|
案例:
点击div2s后变色
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| let ad = document.getElementById('ad')
ad.addEventListener("click", function(){ let _this = this; setTimeout(function(){ _this.style.background = 'pink' }, 2000) })
ad.addEventListener("click", function(){ setTimeout(() => { this.style.background = 'pink' }, 2000) })
|
从数组中返回偶数的元素
1 2 3 4 5 6 7 8 9 10 11
| const arr = [1, 2, 3, 4, 5, 6, 7, 8]
const rst = arr.filter(function(item){ if( item % 2 === 0){ return true }else { return false } })
const rst = arr.filter(item => item % 2 === 0)
|
适合于this无关的回调,定时器,数组
不适合和this有关的回调:事件回调,对象的方法
ES6中函数参数的默认值
ES允许给函数的参数赋初始值;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| function add(a,b,c=10) { return a + b + c; } let result = add(1,2); console.log(result);
function connect({host="127.0.0.1", username,password, port}){ console.log(host) console.log(username) console.log(password) console.log(port) } connect({ host: 'atguigu.com', username: 'root', password: 'root', port: 3306 })
|
rest 参数
ES6 引入 rest 参数,用于获取函数的实参,用来代替 arguments;
参考文章:https://www.jianshu.com/p/50bcb376a419
1 2 3 4 5 6 7 8 9 10
|
function data(...args){ console.log(args); } function data(a, b, c, ...args){ console.log(args); } data("大哥","二哥","三哥","四哥");
|
扩展运算符 …
… 扩展运算符能将数组转换为逗号分隔的参数序列;
扩展运算符(spread)也是三个点(…)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参
数序列,对数组进行解包;
1 2 3 4 5 6 7 8 9 10
|
const tfboys = ['易烊千玺', '王源', '王俊凯'];
function chunwan() { console.log(arguments); }
chunwan(...tfboys);
|
应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const kuaizi = ['王太利','肖央']; const fenghuang = ['曾毅','玲花'];
const zuixuanxiaopingguo = [...kuaizi, ...fenghuang]; console.log(zuixuanxiaopingguo);
const sanzhihua = ['E','G','M']; const sanyecao = [...sanzhihua]; console.log(sanyecao);
const divs = document.querySelectorAll('div'); const divArr = [...divs]; console.log(divArr);
|
Symbol
Symbol 概述:
ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript 语言的第七种数据类
型,是一种类似于字符串的数据类型;
参考文章:https://blog.csdn.net/fesfsefgs/article/details/108354248
Symbol 特点:
- Symbol 的值是唯一的,用来解决命名冲突的问题;
- Symbol 值不能与其他数据进行运算;
- Symbol 定义的对象属性不能使用for…in循环遍历 ,但是可以使用Reflect.ownKeys 来获取对象的
所有键名;
迭代器
生成器
Promise
Promise 是 ES6 引入的异步编程的新解决方案。语法上 Promise 是一个构造函数,用来封装异步操作
并可以获取其成功或失败的结果;
- Promise 构造函数: Promise (excutor) {};
- Promise.prototype.then 方法;
- Promise.prototype.catch 方法;
基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const p = new Promise(function (resolve, reject){ setTimeout(function(){ let data = 'data' resolve(data)
let err = 'error' reject(err)
}, 1000) })
p.then(value => { console.log(value); }, reason => { console.log(reason); })
|
Promise 封装ajax操作
原生Ajax
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const xhr = new XMLHttpRequest()
xhr.open("GET", "http://101.201.64.102:8000/article/all?pn=1&limit=10&condition=")
xhr.send();
xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ if(xhr.status >= 200 && xhr.status < 300){ console.log(xhr.response); }else{ console.error(xhr.status) } } }
|
Promise封装Ajax
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
const p = new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() xhr.open("GET", "http://101.201.64.102:8000/article/all?pn=1&limit=10&condition=") xhr.send(); xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ if(xhr.status >= 200 && xhr.status < 300){ resolve(xhr.response); }else{ reject(xhr.status) } } } })
p.then(value => { console.log(value); }, resaon => { console.log(resaon) })
|
then方法
then方法使得其可以链式调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| const p = new Promise((resolve,reject) => { setTimeout(() => { resolve("用户数据"); },1000); });
const result = p.then(value => { console.log(value); },reason => { console.error(reason); })
p.then(value=>{},reason=>{}).then(value=>{},reason=>{}); console.log(result);
|
catch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const p = new Promise((resolve,reject)=>{ setTimeout(()=>{ reject("失败啦~!"); },1000); })
p.catch(reason=>{ console.warn(reason); });
|
Set
Map
class
数值扩展
对象扩展
模块化
模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来;
模块化的好处:
模块化的优势有以下几点:
- 防止命名冲突;
- 代码复用;
- 高维护性;
模块化规范产品:
ES6 之前的模块化规范有:
- CommonJS => Node.JS、Browserify;
- AMD => requireJS;
- CMD => seaJS;
ES6 模块化语法:
模块功能主要由两个命令构成:export 和 import;
export 命令用于规定模块的对外接口(导出模块);
import 命令用于输入其他模块提供的功能(导入模块);
具体代码见 GITHUB\Learning\Front-End\JavaScript\module-0
Babel编译器
Babel 是一个 JavaScript 编译器;
Babel 能够将新的ES规范语法转换成ES5的语法;
因为不是所有的浏览器都支持最新的ES规范,所以,一般项目中都需要使用Babel进行转换;
步骤:使用Babel转换JS代码——打包成一个文件——使用时引入即可;
步骤:
第一步:安装工具babel-cli(命令行工具) babel-preset-env(ES转换工具) browserify(打包工具,项目中使用的是webpack);
第二步:初始化项目
npm init -y
第三步:安装
npm i babel-cli babel-preset-env browserify
第四步:使用babel转换
npx babel js(js目录) -d dist/js(转化后的js目录) --presets=babel-preset-env
第五步:打包
npx browserify dist/js/app.js -o dist/bundle.js
第六步:在使用时引入bundle.js
<script src="./js/bundle.js" type="module"></script>
转换前后对比:
转换前:
1 2 3 4 5
| export let school = '尚硅谷'; export function teach() { console.log("我们可以教给你开发技能"); }
|
转换后:
1 2 3 4 5 6 7 8 9 10
| "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.teach = teach;
var school = exports.school = '尚硅谷'; function teach() { console.log("我们可以教给你开发技能"); }
|