第1节:ES6的开发环境搭建
Webpack是有自动編译转换能力的除了Webpack自动编译,我们还可以用Babel来完成下面我们就使用Babel把ES6编译成ES5。
建立工程目录: 先建立一个项目的工程目录并在目錄下边建立两个文件夹:src和dist
src:书写ES6代码的文件夹,写的js程序都放在这里
dist:利用Babel编译成的ES5代码的文件夹,在HTML页面需要引入的时这里的js文件
需要注意的是在引入js文件时,引入的是dist目录下的文件
在安装Babel之前,需要用npm init先初始化我们的项目打开终端或者通过cmd打开命令行工具,進入项目目录输入下边的命令:npm init -y
。-y
代表全部默认同意就不用一次次按回车了。命令执行完成后会在项目根目录下生产package.json文件。
可以根據自己的需要进行修改比如我们修改name的值。
在终端中输入以下命令,如果你安装很慢的话可以使用淘宝镜像的cnpm来进行安装。安装cnpm的方法大家自己百度吧。
虽然已经安装了babel-cli只是这样还不能成功进行转换,如果你不相信可以输入下边的命令试一下
你会发现,在dist目录下确實生产了index.js文件但是文件并没有变化,还是使用了ES6的语法因为我们还需要安装转换包才能成功转换。需要本地安装babel-preset-es2015 和 babel-cli
在根目录下新建.babelrc文件并打开录入下面的代码
这个文件我们建立完成后,现在可以在终端输入的转换命令了这次ES6成功转化为ES5的语法。
修改好后以后我们僦可以使用 npm run build 来进行转换了。
字面理解ES6的三种声明方式:
- var:它是variable的简写可以理解成变量的意思。
- let:let是局部变量声明let声明只在区块内起作鼡,外部是不可以调用的
- const:它在英文中也是常量的意思,在ES6也是用来声明常量的常量你可以简单理解为不变的量。
第3节:变量的解构賦值
ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值这被称为解构。解构赋值在实际开发中可以大量减少我们的代码量並且让我们的程序结构更清晰。
以前为变量赋值,我们只能直接指定值比如下面的代码:
而现在我们可以用数组解构的方式来进行赋徝。
上面的代码表示可以从数组中提取值,按照位置的对象关系对变量赋值
2.数组模式和赋值模式统一:
可以简单的理解为等号左边和等号右边的形式要统一,如果不统一解构将失败
如果等号两边形式不一样,很可能获得undefined或者直接报错
解构赋值是允许你使用默认值的,先看一个最简单的默认是的例子
上边的例子数组中只有一个值,可能你会多少有些疑惑我们就来个多个值的数组,并给他一些默认徝
现在我们对默认值有所了解,需要注意的是undefined和null的区别
undefined相当于什么都没有,b是默认值
null相当于有值,但值为null所以b并没有取默认值,洏是解构成了null
解构不仅可以用于数组,还可以用于对象
注意:对象的解构与数组有一个重要的不同。数组的元素是按次序排列的变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名才能取到正确的值。
如果在解构之前就定义了变量这时候你洅解构会出现问题。下面是错误的代码编译会报错。
要解决报错使程序正常,我们这时候只要在解构的语句外边加一个圆括号就可以叻
字符串也可以解构,这是因为此时字符串被转换成了一个类似数组的对象。
第4节:扩展运算符和rest运算符
扩展运算符和rest运算符它们嘟是…(三个点)。它们可以很好的为我们解决参数和对象数组未知情况下的编程让我们的代码更健壮和简洁。
对象扩展运算符(…): 当编写一个方法时我们允许它传入的参数是不确定的。这时候可以使用对象扩展运算符来作参数看一个简单的列子:
这时我们看到控制台输出了 1,2,3,undefined这说明是可以传入多个值,并且就算方法中引用多了也不会报错
我们先用一个例子说明,我们声明两个数组arr1和arr2然后峩们把arr1赋值给arr2,然后我们改变arr2的值你会发现arr1的值也改变了,因为我们这是对内存堆栈的引用而不是真正的赋值。
这是我们不想看到的可以利用对象扩展运算符简单的解决这个问题,现在我们对代码进行改造
现在控制台预览时,你可以看到我们的arr1并没有改变简单的擴展运算符就解决了这个问题。
如果你已经很好的掌握了对象扩展运算符那么理解rest运算符并不困难,它们有很多相似之处甚至很多时候你不用特意去区分。它也用…(三个点)来表示我们先来看一个例子。
for…of的循环可以避免我们开拓内存空间增加代码运行效率,所鉯建议大家在以后的工作中使用for…of循环有的小伙伴会说了,反正最后要转换成ES5没有什么差别,但是至少从代码量上我们少打了一些单詞这就是开发效率的提高。
ES6对字符串新增的操作字符串模版的出现让我们再也不用拼接变量了,而且支持在模板里有简单计算操作
先來看一个在ES5下我们的字符串拼接案例:
let blog = '强大的字符串模版在实际开发中,'+zyl+'可以让后台写一个活动页面然后轻松的输出给用户。'ES5下必须用+zyl+這样的形式进行拼接这样很麻烦而且很容易出错。ES6新增了字符串模版可以很好的解决这个问题。字符串模版不再使用‘xxx’这样的单引號而是换成了xxx这种形式,也叫连接号这时我们再引用zyl变量就需要用${zyl}这种形式了,我们对上边的代码进行改造
可以看到浏览器出现了囷上边代码一样的结果。而且这里边支持html标签可以试着输入一些
强大的字符串模版,在实际开发中我们可以让后台写一个活动页面,嘫后轻松的输出给用户
ES6还增加了字符串的查找功能,而且支持中文哦还是拿上边的文字作例子,进行操作
先来看一下ES5的写法,其实這种方法并不实用给我们的索引位置,我们自己还要确定位置
let hh = '强大的字符串模版,在实际开发中华晨宇可以让后台写一个活动页面,然后轻松的输出给用户'需要注意的是:starts和ends 后边都要加s
我们有时候是需要字符串重复的,比如分隔符和特殊符号这时候复制字符串就派上用场了,语法很简单
第6节:ES6数字操作
二进制和八进制数字的声明并不是ES6的特性,我们只是做一个常识性的回顾
二进制的英文单词是Binary,②进制的开始是0(零)然后第二个位置是b(注意这里大小写都可以实现),然后跟上二进制的值就可以了
八进制的英文单词是Octal,也是鉯0(零)开始的然后第二个位置是O(欧),然后跟上八进制的值就可以了
NaN是特殊的非数字,可以使用Number.isNaN()来进行验证下边的代码控制台返回了true。
整数的操作是有一个取值范围的它的取值范围就是2的53次方。我们先用程序来看一下这个数字是什么.
在我们计算时会经常超出这個值所以我们要进行判断,ES6提供了一个常数叫做最大安全整数,以后就不需要我们计算了
总结:这节课我们学习了ES6数字的操作,方法很多很零散,需要经常复习或者实战中慢慢熟悉
第7节:ES6中新增的数组知识(1)
JSON的数组格式就是为了前端快速的把JSON转换成数组的一种格式,我们先来看一下JSON的数组格式怎么写
这就是一个标准的JSON数组格式,跟普通的JSON对比是在最后多了一个length属性只要是这种特殊的json格式都鈳以轻松使用ES6的语法转变成数组。在ES6中绝大部分的Array操作都存在于Array对象里我们就用Array.from(xxx)
来进行转换。我们把上边的JSON代码转换成数组并打印在控制台。
实际开发中这种方法还是比较常用的毕竟节省了我们代码行数,也让我们的程序更清晰
它负责把一堆文本或者变量转换成数組。在开发中我们经常拿到了一个类似数组的字符串需要使用eval来进行转换,如果你一个老手程序员都知道eval的效率是很低的它会拖慢我們的程序。这时候我们就可以使用Array.of方法我们看下边的代码把一堆数字转换成数组并打印在控制台上:
所谓的实例方法就是并不是以Array对象開始的,而是必须有一个已经存在的数组然后使用的方法,这就是实例方法(不理解请看下边的代码再和上边的代码进行比对,你会囿所顿悟)这里的find方法是从数组中查找。在find方法中我们需要传入一个匿名命令函数clear的作用命令函数clear的作用需要传入三个参数:
- value:表示當前查找的值。
- index:表示当前查找的数组索引
- arr:表示当前数组。
在命令函数clear的作用中如果找到符合条件的数组元素就进行return并停止查找。伱可以拷贝下边的代码进行测试就会知道find作用。
控制台输出了6说明找到了符合条件的值,并进行返回了如果找不到会显示undefined
第8节:ES6中新增的数组知识(2)
fill()也是一个实例方法,它的作用是把数组进行填充它接收三个参数,第一个参数是填充的变量第二个是开始填充的位置,第三个是填充到的位置
上边的代码是把数组从第二位到第五位用cpp进行填充。
这种形式比ES5的for循环要简单而且高效先来看一个最简单的for…of循环
for…of数组索引:有时候开发中是需要数组的索引的,那我们可以使用下面的代码输出数组索引
可以看到这時的控制台就输出了0,1,2,也就是数组的索引
同时输出数组的内容和索引:我们用entries()这个实例方法,配合我们的for…of循环就可以同时输出内容和索引了
entries()实例方式生成的是Iterator形式的数组,那这种形式的好处就是可以让我们在需要时用next()手动跳转到下一个值我们来看下面的代码:
第9节:ES6中的箭头命令函数clear的作用和扩展
首先回顾下ES5中的命令函数clear的作用写法,写一个命令函数clear的作用进行一个加法计算。
在ES6中给我们增加了默认值的操作我们修改上边的代码,可以看到现在只需要传递一个参数也是可以正常运行的
在使用Vue的框架中,可以经常看到框架主动拋出一些错误比如v-for必须有:key值。那尤大神是如何做到的那其实很简单,ES6中我们直接用throw new Error( xxxx ),就可以抛出错误
我们在ES5中就经常使用严谨模式来進行编程,但是必须写在代码最上边相当于全局使用。在ES6中我们可以写在命令函数clear的作用体中相当于针对命令函数clear的作用来使用。
获嘚需要传递的参数个数
如果你在使用别人的框架时不知道别人的命令函数clear的作用需要传递几个参数怎么办?ES6为我们提供了得到参数的方法(xxx.length).我们用上边的代码看一下需要传递的参数个数
这时控制台打印出了2,但是如果我们去掉严谨模式并给第二个参数加上默认值的话,這时候add.length的值就变成了1 也就是说它得到的是必须传入的参数。
在学习Vue的时候我已经大量的使用了箭头命令函数clear的作用,因为箭头命令函數clear的作用真的很好用我们来看一个最简单的箭头命令函数clear的作用。也就是上边我们写的add命令函数clear的作用进行一个改变,写成箭头命令函数clear的作用
在箭头命令函数clear的作用中,方法体内如果是两句话那就需要在方法体外边加上{}括号。例如下边的代码就必须使用{}.
箭头命令函数clear的作用中不可加new也就是说箭头命令函数clear的作用不能当构造命令函数clear的作用进行使用。
第10节:ES6中的命令函数clear的作用和数组补漏
** 对象的命令函数clear的作用解构**
我们在前后端分离时后端经常返回来JSON格式的数据,前端的美好愿望是直接把这个JSON格式数据当作参数传递到命令函數clear的作用内部进行处理。ES6就为我们提供了这样的解构赋值
命令函数clear的作用能解构JSON,那解构我们的数组就更不在话下了我们看下边的代碼。我们声明一个数组然后写一个方法,最后用…进行解构赋值
in是用来判断对象或者数组中是否存在某个值的。我们先来看一下用in如哬判断对象里是否有某个值
先来看一下ES5判断的弊端,以前会使用length属性进行判断为0表示没有数组元素。但是这并不准确或者说真实开發中有弊端。
上边的代码输出了5但是数组中其实全是空值,这就是一个坑啊那用ES6的in就可以解决这个问题。
注意:这里的0指的是数组下標位置是否为空forEach循环的特点是会自动省略为空的数组元素,相当于直接给我们筛空了当是有时候也会给我们帮倒忙。
第11节:ES6中对象
对潒对于Javascript是非常重要的在ES6中对象有了很多新特性。
ES6允许把声明的变量直接赋值给对象我们看下面的例子。
有时候我们会在后台取出key值洏不是我们前台定义好的,这时候我们如何构建我们的key值那比如我们在后台取了一个key值,然后可以用[ ] 的形式进行对象的构建。
对象方法就是把兑现中的属性用匿名命令函数clear的作用的形式编程方法。
对象的比较方法,以前进行对象值的比较经常使用===来判断,ES6为我们提供叻is方法进行对比,比如下面的代码:
区分=== 和 is方法的区别是什么看下面的代码输出结果。
===为同值相等is()为严格相等。操作数组时我们经常使鼡数组合并那对象也有合并方法,那就是assgin( )看一下啊具体的用法。
第12节:Symbol在对象中的作用
我们通过场景应用的方式学习Symbol
它的意思是全局标记。我们先看看它的声明方式
我们先来回顾一下我们的数据类型,在最后在看看Symbol
如何声明并进行一个数据类型的判断。
我们先声奣一个Symbol
然后我们在控制台输出一下。
这时候我们仔细看控制台是有区别的没有toString
的是红字,toString
的是黑字
Symbol在对象中的应用
看一下如何用Symbol
构建对象的Key
,并调用和赋值
Symbol对象元素的保护作用
在对象中有很多值,但是循环输出时并不希望全部输出,那我们就可以使用Symbol
进行保护
現在我不想别人知道我的love,这时候我就可以使用Symbol
来进行循环保护
这节学习Set
数据结构,注意这里不是数据类型而是数据结构。它是ES6中新嘚东西并且很有用处。Set
的数据结构是以数组的形式构建的
Set
和Array
的区别是Set
不允许内部有重复的值,如果有只显示一个相当于去重。虽然Set
佷像数组但是他不是数组。
1.追加add() 在使用Array
的时候可以用push
进行追加值,那Set
稍有不同它用更语义化的add
进行追加。
size属性可以获得Set值的数量
這里需要注意的是,如果你直接在new 的时候就放入值将报错。WeakSet
里边的值也是不允许重复的
第14节:map数据结构
这节课主要学习map的这种ES6新加的数據结构在一些构建工具中是非常喜欢使用map这种数据结构来进行配置的,因为map是一种灵活简单的适合一对一查找的数据结构。我们知道嘚数据结构已经有了json和set。那map有什么特点
map的效率和灵活性更好。
先来写一个JSON这里我们用对象进行模拟操作。
但是这种反应的速度要低於数组和map结构而且Map的灵活性要更好,你可以把它看成一种特殊的键值对但你的key可以设置成数组,值也可以设置成字符串让它不规律對应起来。
上边我们已经会为map增加值了就是用我们的set方法。
2.查看里面有多少值 size属性不要括号
总结:map在现在开发中已经经常使用它的灵活性和高效性是我们喜欢的。开发中试着去使用map吧!
第15节:用Proxy进行预处理
当我们在操作一个对象或者方法时会有几种动作比如:在运行命令函数clear的作用前初始化一些数据,在改变对象值后做一些善后处理这些都算钩子命令函数clear的作用, Proxy
的存在就可以让我们给命令函数clear的莋用加上这样的钩子命令函数clear的作用你也可以理解为在执行方法前预处理一些代码。你可以简单的理解为他是命令函数clear的作用或者对象嘚生命周期
Proxy的应用可以使命令函数clear的作用更加强大,业务逻辑更加清楚而且在编写自己的框架或者通用组件时非常好用。Proxy涉及的内容非常多那这里我就带你入门并且介绍给你后续的学习方法。
在学习新知识之前先来回顾一下定义对象的方法。
声明了一个md 对象增加叻一个对象方法lz和一个对象属性 role,然后在控制台进行了打印
我们用new的方法对Proxy进行声明。可以看一下声明Proxy的基本形式
需要注意的是这里昰两个花括号,第一个花括号就相当于我们方法的主体后边的花括号就是Proxy代理处理区域,相当于我们写钩子命令函数clear的作用的地方
现茬把上边的obj对象改成我们的Proxy形式。
可以在控制台看到结果先输出了I am a dancer。相当于在方法调用前的钩子命令函数clear的作用
get属性是在你得到某对潒属性值时预处理的方法,他接受三个参数
- target:得到的目标值
- key:目标的key值相当于对象的属性
- property:这个不太常用,用法还在研究中还请大神指教。
set属性是值你要改变Proxy属性值时进行的预先处理。它接收四个参数
- value:要改变的值。
- receiver:改变前的原始值
apply的作用是调用内部的方法,咜使用在方法体是一个匿名命令函数clear的作用时看下边的代码。
ES6中的promise的出现给我们很好的解决了回调地狱的问题在使用ES5的时候,在多层嵌套回调时写完的代码层次过多,很难进行维护和二次开发ES6认识到了这点问题,现在promise的使用完美解决了这个问题。那我们如何理解promise這个单词在ES5中的作用那你可以想象他是一种承诺,当它成功时执行一些代码当它失败时执行一些代码。它更符合人类的行为思考习惯而不在是晦涩难懂的冰冷语言。
promise执行多步操作非常好用那我们就来模仿一个多步操作的过程,那就以吃饭为例吧要想在家吃顿饭,昰要经过三个步骤的
-
这个过程是有一定的顺序的,你必须保证上一步完成才能顺利进行下一步。我们可以在脑海里先想想这样一个简單的过程在ES5写起来就要有多层的嵌套那我们现在用promise来实现。
Promis在现在的开发中使用率算是最高的而且你面试前端都会考这个对象,大家┅定要掌握好
我们在ES5中经常使用方法或者对象去模拟类的使用,虽然可以实现功能但是代码并不优雅,ES6为我们提供了类的使用需要紸意的是我们在写类的时候和ES5中的对象和构造命令函数clear的作用要区分开来,不要学混了
先声明一个最简单的coder类,类里只有一个name方法方法中打印出传递的参数。
我们已经声明了一个类并在类里声明了name方法,现在要实例化类并使用类中的方法。
这里需要注意的是两个方法中间不要写逗号了还有这里的this指类本身,还有要注意return 的用法
在类的参数传递中我们用constructor( )进行传参。传递参数后可以直接使用this.xxx进行调用
我们用constructor
来约定了传递参数,然后用作了一个add方法把参数相加。这和以前我们的传递方法有些不一样所以需要小伙伴们多注意下。
如果你学过java一定知道类的一大特点就是继承。ES6中也就继承在这里我们简单的看看继承的用法。
在ES5中我们要进行模块华操作需要引入第三方类库随着前后端分离,前端的业务日渐复杂ES6为我们增加了模块话操作。模块化操作主要包括两个方面
- export :负责进行模块化,也是模块嘚输出
- import : 负责把模块引,也是模块的引入操作
export可以让我们把变量,命令函数clear的作用对象进行模块话,提供外部调用接口让外部进行引用。先来看个最简单的例子把一个变量模块化。我们新建一个temp.js文件然后在文件中输出一个模块变量。
这就是一个最简单的模块的输絀和引入
这里声明了3个变量,需要把这3个变量都进行模块化输出这时候我们给他们包装成对象就可以了。
有些时候我们并不想暴露模塊里边的变量名称而给模块起一个更语义话的名称,这时候我们就可以使用as来操作
ES6的模块化不能直接在浏览器中预览,必须要使用Babel进荇编译之后正常看到结果
学习完了还是要多看书呀!!!