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():返回布尔值,是否包含,包含就返回true
- startsWith():返回布尔值,表示是否以参数字符串开头,- 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只支持一个函数或类!
 
- 使用前两个命令的时候,我们必须清除变量或者函数的名字,但是,用户懒得记而且用的少,我们可以使用