我们写ES6是为了使其运行在浏览器上,但是ES6有一些新特性需要我们转码,把ES6代码转化成ES5代码再运行到浏览器当中
++因为现在有些浏览器对ES6支持性不是特别好++代码转化我们就需要安装Nodejs环境
Nodejs
会附带一个npm
命令,npm
是Node的包管理工具::它的简单结构有助于Nodejs生态系统的激增,现在npm
有超过一千万个自由使用的开源库包,用处特别广泛!++Nodejs可以看成一个庞大的代码仓库++npm
下载比较慢,因为正版的npm
的资源在国外,但我们的网是国内的网,所以建议使用npm
镜像++已经下载好了,我们以后用的npm命令下载改成cnpm命令就行了++Babel 是一个 JavaScript编译器。主要用于将高版本的JavaScript代码转为向后兼容的JS代码,从而能让我们的代码运行在更低版本的浏览器或者其他的环境中。
cnpm install --save-dev @babel/core
安装Babelnode_modules
之下新建文件.babelrc
,再加一些规则.babelrc
中添加规则npx babel example.js
就可以在终端中看到转化后的ES5代码++做不出来,放弃了,反正不常用++var
:函数级作用域,var所声明的变量在var所在函数内++也就是说,除非是有函数把var包围,变量只属于该函数,其他情况之下var的变量可以任意使用++let
:块级作用域,范围就是块(花括号)。在for
循环中很适合使用let
,因为不同函数早已超过块级作用域,我们可以在每个for
中都let i = 0
不用去担心 i 会不会重复var
可以重复声明同一个变量,如果是var a;
::那么不会对原来产生任何影响,但也不会造成任何错误::如果是var a = 300;
那么效果就是重新赋值!{let a;var a;}
也是错误的,let
已经把a占有了,不允许重复声明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)}
直接就能打印每一个字符!${}
,剩下不变的字符都当作模板了includes()/startsWith()/endsWith()
includes()
:返回布尔值,是否包含,包含就返回truestartsWith()
:返回布尔值,表示是否以参数字符串开头,endsWith()
同理indexOf()
方法的详细版本,更有针对性repeat()
padStart()/End()
:长度补全功能
padStart()
用于补全头部,另一个补全尾部trimStart()/End()
:前后去掉空格++返回的都是新字符串,不会修改原始字符串++at()
:
undefined
apply()
方法
Math.max
用法是Math.max(10,20,30);
后者恰好是扩展运算符分割后的数组arr1.concat(arr2)
[...arr1,...arr2]
,也可以用前面的,::后面应该会有消耗的区别::类数组/伪数组:arguments、元素集合、类似数组的对象,只能使用数组的++读取方式[0/1…]和length属性,不能使用数组方法++
arguments
arguments
读取额外传递过来的参数,形式如10,20,30
NodeList
之前仔细讲过user['0']
去读取Array.from(类数组名)
直接变成数组,很简单::也不改变原来伪数组的形式::10,str,30
任意搭配,可以新建变量承接数组name:name,...
可以省略为name,
get:function(){}
这么麻烦了,直接写成独立的函数,函数的键可以省略::但是记得取个名字::get(){}
[property]:rich
var fn = (参数) => 返回值
++函数代码只有一条返回时++注意,如果**返回值是对象,则应在对象的外面加一层()**否则会报错var fn = (参数) =>{全部函数体}
++函数体代码比较多的时候使用++this
,如果在箭头函数中用到this那就纯纯指向上一层的变量::指向能力比较菜,但是方法完全不影响它的指向::this
是指向对象,但是它**一旦遇到像setTimeout()
这种指向windows
**的方法,它的指向也会改变,指向之外的windows
中的变量(是跨过对象指引的)::容易受方法指向的操控::setTimeout()
中用到对象中的成员,就必须用箭头函数或者*函数之前var that = this;
的方法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()
:清除所有的成员,没有返回值,没有参数Async可以将异步操作变成同步操作,比较常见的异步操作就是
setTimeout()
定时器,::遇到定时器不管有没有成功,结果我不管,继续往下执行::
++这个函数的作用就是:让异步操作不要脱离大队,所有操作都要等待异步操作完成之后再继续进行,保证了执行顺序就是实际效果的顺序++用法:
async function asyncPrint(time,value){
await timeout(time);
console.log(value);
}
async
,后面加了awaittimeout()
是带有定时器的异步操作,我们要在异步操作前加await关键字::很形象,所有操作必须要等待它::Async
具有很大的应用场景class Person{ }
而且内部函数之间不用写,
constructor(){}
是类的默认构造函数,一个类必须要有constructor++如果没有显示定义,则填补默认构造函数+new
方法new
出来的实例对象调用的方法static
。唯一不同的一点是,我们之前调用静态函数都是::,这里直接用类名.静态方法
的形式this
,那么它指向的就是整个类extends
替换原来的:public
constructor(){}
,参数(包括父类)都要写上,并且在构造函数中加**super(父类构造函数的参数);**表明父类的初始化变量才行Module:帮助我们管理JS中文件与文件之间的关系JS需要模块体系把一个大程序拆分成相互依赖的小文件,再用简单的方法拼装起来
export
::导出::和import
::导入::命令完成模块
export var year = 2022;
/export function(){}
在一个文件中导出import{year,...}from 文件名
:导入别的文件
value as val
使用as关键字import * as 对象名 from 文件名
,调用成员时和对象一样使用就好export default
:
export default
命令import
中可以任意起一个名字接着用export default
只支持一个函数或类!