JavaScript(ES6进阶部分)
简介
- ES6泛指 从2015年之后的所有ES版本,含义就是5.1版本以后JS的下一代标准
- ++ES是JS的规格,JS是ES的实现++
- 标准委员会(TC39委员会)
- 批准修改语法,使其从提案变成正式标准
%% ES6带来了许多新特性 ,之后要学的的命令、扩展、对象、继承都是新特性,学完这些新特性咱就开始搞Vue架构了,加油!
- 批准修改语法,使其从提案变成正式标准
Nodejs环境
我们写ES6是为了使其运行在浏览器上,但是ES6有一些新特性需要我们转码 ,把ES6代码转化成ES5代码再运行到浏览器当中
++因为现在有些浏览器对ES6支持性不是特别好++代码转化我们就需要安装Nodejs环境
- Nodejs主攻服务器方向 可以用JS完成服务器代码的编写
%% 原本JS只能写写前端,后端服务器部分需要另外的语言写,Nodejs是基于 Chrome V8 引擎的 Javascript 运行环境 , Node.js 出现之后,JS 前后通吃了 Nodejs
会附带一个npm
命令,npm
是Node的包管理工具::它的简单结构有助于Nodejs生态系统的激增,现在npm
有超过一千万个自由使用的开源库包,用处特别广泛!++Nodejs可以看成一个庞大的代码仓库++- 但我们直接用
npm
下载比较慢,因为正版的npm
的资源在国外,但我们的网是国内的网,所以建议使用npm
镜像++已经下载好了,我们以后用的npm命令下载改成cnpm命令就行了++ - 目前咱不讲node,只需要把cnpm搞出来就好了
- API(Application Programming Interface)是应用程序编程接口,简称接口
Babel转码器:ES6->ES5
Babel 是一个 JavaScript编译器。主要用于将高版本的JavaScript代码转为向后兼容的JS代码,从而能让我们的代码运行在更低版本的浏览器或者其他的环境中。
安装流程
- 安装:注意要安装在项目的根目录之下 ,在vscode中选中文件 ,右键在集成终端中打开 ::弹出的对话框就是我们的cmd终端::,命令
cnpm install --save-dev @babel/core
安装Babel - 配置文件:在
node_modules
之下新建文件.babelrc
,再加一些规则 - 安装转码规则::Babel本身是不具有转码功能的,我们目前学的比较笼统::
- 再在
.babelrc
中添加规则 - 再tm安装命令行工具
对ES6转码
- 转码结果输出到标准流 当中::这里的标准流在终端能够看到::在命令行中用
npx babel example.js
就可以在终端中看到转化后的ES5代码++做不出来,放弃了,反正不常用++ - 我草泥马根本转化不过来卧槽泥马勒戈壁!!!!
命令
Let命令
- 用法类似于var,但是所声明的变量只在let命令代码块内有效
var
:函数级作用域,var所声明的变量在var所在函数内++也就是说,除非是有函数把var包围,变量只属于该函数,其他情况之下var的变量可以任意使用++let
:块级作用域 ,范围就是块(花括号)。在for
循环中很适合使用let
,因为不同函数早已超过块级作用域 ,我们可以在每个for
中都let i = 0
不用去担心 i 会不会重复var
可以重复声明同一个变量 ,如果是var a;
::那么不会对原来产生任何影响,但也不会造成任何错误::如果是var a = 300;
那么效果就是重新赋值!
- let不存在变量提升,不允许(在同一个花括号中)重复声明!!!
{let a;var a;}
也是错误的,let
已经把a占有了,不允许重复声明
Const命令
- 一旦声明,不可改变!必须立刻初始化!!!
Const
和let
作用域相同,变(常)量都不提升,不可重复声明
对象解构赋值
解构赋值是很大的概念 ,数组、字符串等都有,只不过应用的很少,本次我们主要讲对象的解构赋值
- 对象的解构赋值用于++频繁使用对象的成员++,相当于同时设置了许多变量 ,每个变量都承载着对象成员的值,使用时就不用
user.name
了,直接name
甚至更简单,减小我们重复的代码量 - 用法:
const{name,age} = user;
::let也行,建议使用const::,user的name``age
属性没有次序,变量必须与属性同名才能取到正确的值,与变量的顺序没有任何关系 - 这个在我们了解对象之后简直起飞,平常用到的
console.log()
其实就是console
对象的方法,解构赋值 不仅可以传值还可以传递方法 ::之前学的Date/Math等等都可以用啊::- 但是注意,如果我们先前声明了某个变量 ,并且变量与被解构对象的成员或者方法重名,那么会报错。一定注意声明的变量名。
- 上述情况之下,我们把
const/let
去掉,在最外面加一个()就完美解决,比如:😦{name,age}=user);但是很麻烦也不好看,不建议!::
扩展(新增功能)
字符串扩展
- 字符串对
Unicode
有了更好的支持Unicode
:统一码、万国码、单一码,是计算机领域的一项业界标准。为每种语言设定了统一并且唯一的二进制编码,以满足跨语言、跨平台的交流::100%兼容::
- 字符串的遍历器接口
for...of
循环遍历字符串for(let i of str){console.log(i)}
直接就能打印每一个字符!
- 模板字符串 (template string)::使用率高高的::
- 增强版的字符串,用反引号``标识,既可以当成普通字符串使用,也可以在字符串中嵌入变量这个看vs吧
- 变量的嵌入用到
${}
,剩下不变的字符都当作模板了
字符串新增方法(提供更加优质的开发体验)
includes()/startsWith()/endsWith()
includes()
:返回布尔值,是否包含,包含就返回truestartsWith()
:返回布尔值,表示是否以参数字符串开头,endsWith()
同理- 三者都支持参2,表示开始搜索的位置 。这三者就是
indexOf()
方法的详细版本,更有针对性
repeat()
- 返回一个重复好多次的新字符串++参数为字符串重复的次数,若为0则返回空字符串++
padStart()/End()
:长度补全 功能- 参数1是设置的长度,参数2是填充的字符串。
padStart()
用于补全头部,另一个补全尾部 - ::如'x'.padStart(4,'ab')结果就是'abax'::
- 参数1是设置的长度,参数2是填充的字符串。
trimStart()/End()
:前后去掉空格++返回的都是新字符串,不会修改原始字符串++at()
:- 接受一个整数作为参数,返回参数指定位置的字符,::和STL容器中的作用是一样的::
- 支持++负索引,从右往左开始++
- 如果参数位置超过字符串,则返回
undefined
JS中的字符串方法是不会改变原来字符串的!
数组扩展之扩展运算符(.../spread)
- ...+数组
- 将一个数组分割成参数序列,本质是由逗号隔开,打印时由空格隔开
- ++比如(...[1,2,3])会打印出1 2 3++
- 替代函数的
apply()
方法- 比如我们要找到数组的最大值,一用算法,二用Math.max.apply(null,arr)++这里的apply就是把Math.max这个方法借用到数组中去++
Math.max
用法是Math.max(10,20,30);
后者恰好是扩展运算符分割后的数组
- 合并数组
- 之前的方法是
arr1.concat(arr2)
- 现在直接用
[...arr1,...arr2]
,也可以用前面的,::后面应该会有消耗的区别::
- 之前的方法是
数组扩展之新增方法
Array.from():将类数组转为真正的数组
类数组/伪数组:arguments、元素集合、类似数组的对象,只能使用数组的++读取方式[0/1...]和length属性,不能使用数组方法++
arguments
- 调用 函数时我们可以在原函数没有参数的时候主动传递参数 ,原函数可以使用
arguments
读取额外传递过来的参数,形式如10,20,30
- 调用 函数时我们可以在原函数没有参数的时候主动传递参数 ,原函数可以使用
- 元素集合:
NodeList
之前仔细讲过 - 类似数组的对象:
- 键的形式是::'0','1','2'...::和数组的下标很像,可以像数组一样
user['0']
去读取 - ++因为有引号,所以没法user.'0',只能像数组一样读++
- 键的形式是::'0','1','2'...::和数组的下标很像,可以像数组一样
Array.from(类数组名)
直接变成数组,很简单::也不改变原来伪数组的形式::
Array.of():将一组值转为数组
- 参数就是
10,str,30
任意搭配,可以新建变量承接数组
Array():数组的构造函数
- 后面直接跟参数1,表示开辟长度为参数1的空的数组空间
对象扩展
属性简洁表示法
- 键值对:
- 如果值是已声明的变量,并且键值名相同,:和后面的值就可以省略
- 比如
name:name,...
可以省略为name,
- 函数:
- 不用写
get:function(){}
这么麻烦了,直接写成独立的函数,函数的键可以省略::但是记得取个名字:: - 比如
get(){}
- 不用写
属性名表达式
- 允许定义对象时,用**[ 表达式 ]**作为对象的属性名
- 比如
[property]:rich
扩展运算符(...)
- 拆解对象,就是去掉对象和{ },注意这时不能进行控制台打印会报错
函数扩展:箭头函数
- 用法:
var fn = (参数) => 返回值
++函数代码只有一条返回时++注意,如果**返回值是对象,则应在对象的外面加一层()**否则会报错var fn = (参数) =>{全部函数体}
++函数体代码比较多的时候使用++
- 最常用的情况是回调函数(匿名函数),就是一个函数没有名字
- 指向:
- 前提:++函数在对象里++
- 箭头函数没有
this
,如果在箭头函数中用到this那就纯纯指向上一层的变量::指向能力比较菜,但是方法完全不影响它的指向:: - 普通函数
this
是指向对象,但是它**一旦遇到像setTimeout()
这种指向windows
**的方法,它的指向也会改变,指向之外的windows
中的变量(是跨过对象指引的)::容易受方法指向的操控:: - 所以如果我们想在
setTimeout()
中用到对象中的成员,就必须用箭头函数 或者*函数之前var that = this;
的方法
Set数据结构
属性
- 类似于数组,但是成员的值必须是唯一的,不允许重复++当然了,如果咱给Set重复的值,它不报错,自动去重++
- 创建:
Set
本身就可以用作构造函数::像数组的Array( )一样::- 创建集合:搭配
new
关键字,const s = new Set();
创建的形式是唯一的
- 参数:
- 数组:
const s = new Set([1,2,3,4]);
,也支持[...set]
扩展运算符,扩展之后是1,2,3,4,再加[]
就又成为数组 - 字符串:
new Set('abcde');
- 数组:
- 去重(去掉重复的元素):
- 数组:
[...new Set(arr)]
先把数组的值给集合,再让集合自动去重 ,此时因为Set集合不是数组所以要把Set扩展再形成数组 - 字符串:
[...new Set('abbcde')].join('');
join是把数组转换成字符串
- 数组:
- 向
Set
加入值的时候,不会发生类型转换,所以5和"5"属于两个不同的值 size
属性:返回集合中的成员个数
方法
add()
:添加成员delete()
:删除成员has()
:返回布尔值,判断参数的内容是否在集合中clear()
:清除所有的成员,没有返回值,没有参数
Promise对象(异步/网络请求)
基本概念
- Promise是异步编程的解决方案
- 从语法上讲,Promise是一个对象,我们可以从中获取异步操作的消息
- Promise提供统一的API
- 简单来说Promise就是一个容器 ,保存着某个未来才会结束的事件(通常是异步操作)的结果。
%% 异步操作,在前端往往变成网络请求。什么是未来结束?就是说这件事比较消耗时间,为了不耽误其余工作,我们让它自己执行,执行好了再告诉我们一声,Promise就是能更好地告诉我们一声。 - Promise对象我们就可以将异步操作以同步操作的流程表达出来 ,避免了之前传统的层层嵌套的回调函数
基本用法
Async(异步)函数
Async可以将异步操作变成同步操作 ,比较常见的异步操作就是
setTimeout()
定时器,::遇到定时器不管有没有成功,结果我不管,继续往下执行::
++这个函数的作用就是:让异步操作不要脱离大队,所有操作都要等待异步操作完成之后再继续进行,保证了执行顺序就是实际效果的顺序++用法:
async function asyncPrint(time,value){
await timeout(time);
console.log(value);
}
- 与普通函数的区别就是最前面加了
async
,后面加了await - 这里的
timeout()
是带有定时器的异步操作,我们要在异步操作前加await关键字::很形象,所有操作必须要等待它:: - 网络请求 之间有依赖关系 ,很多接口可能要依赖遇上一个接口的数据才能执行,所以
Async
具有很大的应用场景
Class类
基本语法
- 和传统语言的类很像!是
class Person{ }
而且内部函数之间不用写,
constructor(){}
是类的默认构造函数,一个类必须要有constructor++如果没有显示定义,则填补默认构造函数+- 类的实例生成一定要通过
new
方法 - 不存在类的提升!!!必须先定义后使用!!!
属性与方法:分为实例(局部)和静态
- 实例方法:通过
new
出来的实例对象调用的方法 - 实例属性:类的实例对象可调用的属性
- 静态
- 和之前的一样,前面加
static
。唯一不同的一点是,我们之前调用静态函数都是::,这里直接用类名.静态方法
的形式 - 如果静态方法出现
this
,那么它指向的就是整个类
- 和之前的一样,前面加
继承
extends
替换原来的:public
- 构造函数有变动
- ++因为我们之前学的构造函数是有独特的名字,所以系统支持一些东西,但ES6有些不支持++
- 还是写成
constructor(){}
,参数(包括父类)都要写上,并且在构造函数中加**super(父类构造函数的参数);**表明父类的初始化变量才行
Module(模块)
Module:帮助我们管理JS中文件与文件之间的关系 JS需要模块体系把一个大程序拆分成相互依赖的小文件,再用简单的方法拼装起来
- 通过
export
::导出::和import
::导入::命令完成模块export var year = 2022;
/export function(){}
在一个文件中导出- export 定义了模块的对外接口 后,其他的JS文件就可以通过import 命令加载这个模块
import{year,...}from 文件名
:导入别的文件- 如果想在别的文件中修改变量的名字,可以在{ }中用MySQL的方式
value as val
使用as关键字 - 也可以用星号全部调用 ,但只能以对象的形式
import * as 对象名 from 文件名
,调用成员时和对象一样使用就好
- 如果想在别的文件中修改变量的名字,可以在{ }中用MySQL的方式
export default
:- 使用前两个命令的时候,我们必须清除变量或者函数的名字,但是,用户懒得记而且用的少,我们可以使用
export default
命令 - 该命令用于函数和类 ,我们不用在乎我们导出的这俩叫什么名字,在
import
中可以任意起一个名字接着用 - 注意,
export default
只支持一个函数或类!
- 使用前两个命令的时候,我们必须清除变量或者函数的名字,但是,用户懒得记而且用的少,我们可以使用