前言
在编程过程中,我一直是使用es5来进行编程。但随着es6、es7的引入,意识到学习它们的必要性。因此,现在开始学习es6新语法,以下是根据学习视频记录的笔记。
1.初始化项目
在安装Babel之前,需要用npm init先初始化我们的项目。打开终端或者通过cmd打开命令行工具,进入项目目录,输入下边的命令:
1 | npm init -y // 自动生成package.json文件 |
需求:如何将dist文件夹中的js将es6转化为es5编程。
1 | npm install -g babel-cli |
2.声明方式
ES6的三种声明方式:
- var:声明全局变量;
- let:声明局部变量,防止数据污染;
- const:声明常量,用来定义一个不可变的常量,如果改变了就会报语法错误。
var
1 | var a = 'abc'; |
let
1 | { |
const
1 | var a = "abc"; |
会报语法错误:
3.解构赋值
什么是解构?ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。
解构的作用?解构赋值在实际开发中可以大量减少我们的代码量,并且让我们的程序结构更清晰。
数组的结构赋值:
1 | let a=0; |
1 | 数组模式和赋值模式统一: |
数组函数的解构赋值
1 | let arr = ['good','better','best']; |
解构的默认值:
解构赋值是允许你使用默认值的
1 | let [foo = true] =[]; |
1 | let [a,b="world"]=['hello ']; |
注意:undefined 和 null的区别
1 | let [a,b="world"]=['hello ',undefined]; |
1 | let [a,b="world"]=['hello ',undefined]; |
对象的解构赋值
1 | let {a,b} ={a:"abc",b:"123"}; |
注意:对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
对象函数的解构赋值
1 | let json = { |
es6小坑:
1 | //当先声明了对象,然后再对象解构,这会报错 |
字符串的解构赋值
1 | const [a,b,c,d,e]="hello"; |
4.对象扩展运算符和rest运算符
对象扩展运算符(…)
当编写一个方法时,我们允许它传入的参数是不确定的,这时候可以使用对象扩展运算符来作参数。
1 | function fn(...arg) { |
作用:用来解决数组赋值会改变原数组数据的问题。
1 | let arr1 = ['a','b','c']; |
使用对象扩展运算符后
1 | let arr1 = ['a','b','c']; |
rest运算符(…)
也用”…”表示
用法:
1 | function fn(a,b,...arg) { |
5.字符串模板
使用方法:字符串必须使用’`’(~下面的符号)包围,然后使用${变量}。
1 | let name = 'whittney'; |
字符串的方法:
1.查找是否存在:includes()
1 | let name = 'whittney'; |
2.判断开头是否存在:startsWith()
1 | let name = 'whittney'; |
3.判断结尾是否存在:endsWith()
1 | let name = 'whittney'; |
4.复制字符串:repeat()
1 | let name = 'whittney'; |
6.数字操作
1.如何表示二进制数?
二进制的英文单词是Binary,以0(零)和b(或B)开头,后面为二进制值即可。
1 | let binary = 0b0101; |
2.如何表示八进制数?
八进制的英文单词是Octal,以0(零)和o(或O)开头,后面为八进制值即可。
1 | let octal = 0o0032; |
3.判断是否是数字
Number.isFinite( )来进行数字验证,只要是数字,不论是浮点型还是整形都会返回true,其他时候会返回false。
1 | let a = 'a'; |
4.判断是否为整数Number.isInteger(xx)
1 | let a=111.123; |
5.转换为整数
1 | let a= '111.123'; |
6.转换为浮点数
1 | let a= '111.123'; |
7.ES6中新增的数组知识
1.json数组格式是什么样的?
1 | let json = { |
如何将json数组转化为数组?
1 | let json = { |
2.Array.of()方法
将一堆文本或者变量转换成数组
1 | let arr = Array.of("abc",3,5); |
3.find()方法
从数组中查找元素
有三个参数:
val:表示当前查找的值;
index:表示当前查找的数组索引;
arr:表示当前数组。
1 | let arr = [1,3,5,7,9]; |
4.fill()方法
数组进行填充,其实就是替换数组元素。
也有三个参数:第一个参数是要填充的内容,第二个参数是开始填充的位置,第三个是填充到的位置(不包括)。
1 | let arr = [0,1,2,3]; |
5.for..of循环
输出内容
1 | let arr = ['a','b','c']; |
输出索引
1 | let arr = ['a','b','c']; |
同时输出内容和索引
1 | let arr = ['a','b','c']; |
6.entries()
生成的是Iterator形式的数组,好处就是可以让我们在需要时用next()手动跳转到下一个值。
1 | let arr = ['a','b','c']; |
7.in
判断对象或者数组中是否存在某个值。
对象判断:
1 | let obj = { |
数组判断:
1 | let arr= ['a','b']; |
8.箭头函数
ES6中给我们增加了默认值的操作
1 | function add(a,b=3) { |
主动抛出错误:vue框架中就是这样抛出错误的。
1 | function add(a,b=3) { |
获得需要传递的参数个数
如果你在使用别人的框架时,不知道别人的函数需要传递几个参数怎么办?ES6为我们提供了得到参数的方法(xxx.length)。
1 | function add(a,b) { |
两个坑:
(1)如果既使用默认值,又使用严谨模式的话,就会产生冲突。
1 | function add(a,b=3) { |
(2)当参数中有默认值时,获取需要传递的参数个数时,不会计算有默认值的参数。所以这里需要注意的是add.length返回的参数个数是必须传递参数的个数。
1 | function add(a,b=2) { |
这里说明一下,b的值不一定为2,也可以重新赋值
1 | function add(a,b=2) { |
箭头函数
如果箭头函数就一句,可以直接这么写
1 | let add = (a,b=1)=> a+b; |
否则需要加上花括号以及return
1 | let add = (a,b=1)=> { |
箭头函数中不可加new,也就是说箭头函数不能当构造函数进行使用。
9.ES6中的对象
对象赋值
之前对象赋值是这样的
1 | let name = 'whittney'; |
现在可以这样写
1 | let name = 'whittney'; |
对象key值构建
1 | let key = 'name'; |
Object.is( )方法进行对象比较
1 | let obj1 = {name: 'whittney'}; |
10.Symbol数据类型
1 | let a = Symbol(); |
symbol数据类型和string数据类型的区别?
1 | let a = Symbol('whittney'); |
symbol对象元素的保护作用
没有使用symbol之前
1 | let obj = {name:'whittney',skill: 'web',age: 18}; |
假如这时有一个需求:不想打印出age
1 | let obj = {name:'whittney',skill: 'web'}; |
11.Set和WeakSet数据结构
Set数据结构(数组)
Set和Array 的区别是Set不允许内部有重复的值,如果有只显示一个,相当于去重。虽然Set很像数组,但是他不是数组。而且Set数据结构只能放数组。
1 | let setData =new Set(['whittney','lily','lily','tina']); |
Set数据结构的增删查,没有改
(1)增:setData.add()
1 | let setData =new Set(['whittney','lily','tina']); |
(2)删:setData.delete()
1 | let setData =new Set(['whittney','lily','tina']); |
(3)查:setData.has(),返回的是true或者false。
1 | let setData =new Set(['whittney','lily','tina']); |
(4)删除所有值:setData.clear();
1 | let setData =new Set(['whittney','lily','tina']); |
(5)for…of…循环
1 | let setData =new Set(['whittney','lily','tina']); |
(6)forEach循环
1 | let setData =new Set(['whittney','lily','tina']); |
WeakSet数据结构(对象)
WeakSet数据结构只能放数组。WeakSet里边的值也是不允许重复的。
1 | let weakObj = new WeakSet(); |
坑:
1 | 如果你直接在new 的时候就放入值,将报错。 |
12.map数据结构
map的效率和灵活性更好。
(1)set():赋值
1 | let json = { |
(2)get():取值
1 | let json = { |
(3)delete():删除
1 | let json = { |
(4)map.has():查找是否有key为某某的map
1 | let json = { |
(5)clear():清楚所有map
1 | let json = { |
13.用Proxy进行预处理
声明Proxy
1 | let pro = new Proxy({ |
第一个花括号就相当于我们方法的主体,后边的花括号就是Proxy代理处理区域,相当于我们写钩子函数的地方。
get属性
get属性是在你得到某对象属性值时预处理的方法,他接受三个参数:
target:得到的目标值
key:目标的key值,相当于对象的属性
property:这个不太清楚
1 | let pro = new Proxy({ |
可以在控制台看到结果,先输出了target和key的值。相当于在方法调用前的钩子函数。
set属性
set属性是值你要改变Proxy属性值时,进行的预先处理。它接收四个参数。
target:目标值。
key:目标的Key值。
value:要改变的值。
receiver:改变前的原始值。
1 | let pro = new Proxy({ |
apply属性
apply的作用是调用内部的方法,它使用在方法体是一个匿名函数。
1 | let target = function () { |
14.Promise
ES6中的promise很好的解决了回调地狱的问题。
什么是回调地狱?
回调地狱指的是多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发。
1 | function fn1() { |
promise的基本用法
promise执行多步操作非常好用,那我们就来模仿一个多步操作的过程,那就以吃饭为例吧。要想在家吃顿饭,是要经过三个步骤的。
- 洗菜做饭。
- 坐下来吃饭。
- 收拾桌子洗碗。
这个过程是有一定的顺序的,你必须保证上一步完成,才能顺利进行下一步。
1 | let state = 1; |
假如有中间有一个步骤失败,后面的步骤就不会进行下去。
1 | let state = 1; |
15.类
类的使用
1 | class Coder { |
注意:
1.两个方法中间不要写逗号;
2.这里的this指类本身;
3.注意return 的用法。
类的传参
用constructor( )进行传参,传递参数后可以直接使用this.xxx进行调用。
1 | class Coder { |
类的继承
声明一个htmler的新类并继承Coder类,htmler新类里边为空,这时候我们实例化新类,并调用里边的name方法。结果也是可以调用到的。注:使用extends继承。
1 | class Coder{ |
16.模块化
模块化操作主要包括两个方面。
export :负责进行模块化,也是模块的输出。
import : 负责把模块引,也是模块的引入操作。
模块化基本使用
在src目录下新建一个temp.js文件,就是一个模块。里面代码如下,输出一个模块变量:
1 | export var name = 'whittney'; |
在src目录的index.js文件中以import的形式引入:
1 | import {name} from './temp'; |
注意:
ES6的模块化不能直接在浏览器中预览,必须要使用Babel进行编译之后正常看到结果。
编译方法为:
一般我们的终端路径为项目名称下,如:project>
。但是执行以下命令时,需要进入project/src>
路径下
1 | babel-node index.js |
如何输出多个变量?
方法:把它们包装成对象就可以了。
temp.js文件
1 | var a = 1; |
index.js
1 | import {a,b,c,add} from './temp'; |
使用as避免暴露模块里面的变量名称
给模块起一个更语义话的名称,输出和输入时直接使用该名称。比如:a as x
意思是给模块a另起一个名称x,避免模块a的名称暴露。
temp.js文件
1 | var a = 1; |
index.js
1 | import {x,y,z} from './temp'; |
export default的使用
temp.js文件
1 | var a = 'whittney'; |
index.js文件
1 | import str from './temp'; |
export和export default的区别
export和export default最大的区别就是export不限变量数 可以一直写,而export default 只输出一次 而且 export出的变量想要使用必须使用{}来盛放,而export default 不需要 只要import任意一个名字来接收对象即可。