var let const的区别
数组新增拓展
对象新增拓展
函数新增拓展
Set 和Map
Promise
Generator
Proxy
Module
Decorator
一、var
1、在ES5中,顶层对象的属性和全局变量是等价的,用var
声明的变量既是全局变量,也是顶层变量:
window
对象,在Node
指的是global
对象2、使用var
声明的变量存在变量提升的情况
3、使用var
,我们能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明:
var
声明变量时候,该变量是局部的var
,该变量是全局的二、let
1、let
是ES6
新增的命令,用来声明变量
2、用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效,不存在变量提:
let
命令,这个区域就不再受外部影响3、使用let
声明变量前,该变量都不可用,也就是大家常说的暂时性死区:
let
不允许在相同作用域中重复声明三、const
1、const
声明一个只读的常量,一旦声明,常量的值就不能改变:
const
一旦声明变量,就必须立即初始化,不能留到以后赋值var
或let
声明过变量,再用const
声明同样会报错2、const
实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动:
const
只能保证这个指针是固定的,并不能确保改变量的结构不变四、区别
1、变量提升:
var
声明的变量存在变量提升,即变量可以在声明之前调用,值为undefinedlet
和const
不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错2、暂时性死区:
var
不存在暂时性死区let
和const
存在暂时性死区,只有等到声明变量的那一行代码出现,才可以获取和使用该变量3、块级作用域:
var
不存在块级作用域let
和const
存在块级作用域4、重复声明:
var
允许重复声明变量let
和const
在同一作用域不允许重复声明变量5、修改声明的变量:
var
和let
可以const
声明一个只读的常量。一旦声明,常量的值就不能改变五、使用
const
的情况尽量使用const
,其他情况下大多数使用let
,避免使用var
一、扩展运算符的应用
1、ES6通过扩展元素符...
,好比rest
参数的逆运算,将一个数组转为用逗号分隔的参数序列:
2、扩展运算符可以与解构赋值结合起来,用于生成数组。如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错:
3、定义了遍历器(Iterator)接口的对象,都可以用扩展运算符转为真正的数组。如果对没有 Iterator 接口的对象,使用扩展运算符,将会报错
二、构造函数新增的方法
1、Array.from():将两类对象转为真正的数组:类似数组的对象和可遍历(iterable)
的对象(包括ES6
新增的数据结构Set
和Map
)
2、Array.of():用于将一组值,转换为数组
Array()
才会返回由参数组成的新数组三、实例对象新增的方法
1、copyWithin():将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组
2、find()、findIndex():find()
用于找出第一个符合条件的数组成员
this
对象3、fill():使用给定值,填充一个数组
4、entries(),keys(),values():
keys()
是对键名的遍历values()
是对键值的遍历entries()
是对键值对的遍历5、includes():用于判断数组是否包含给定的值
0
6、flat(),flatMap():将数组扁平化处理,返回一个新数组,对原数据没有影响
flat()
:默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()
方法的参数写成一个整数,表示想要拉平的层数,默认为1flatMap()
方法对原数组的每个成员执行一个函数相当于执行Array.prototype.map()
,然后对返回值组成的数组执行flat()
方法。该方法返回一个新数组,不改变原数组。flatMap()方法还可以有第二个参数,用来绑定遍历函数里面的this四、数组的空位
1、数组的空位指,数组的某一个位置没有任何值
undefined
Array.from
、扩展运算符、copyWithin()
、fill()
、entries()
、keys()
、values()
、find()
和findIndex()
一、属性的简写
1、ES6中,当对象键名与对应值名相等的时候,可以进行简写。方法也能够进行简写。在函数内作为返回值,也会变得方便很多:
二、属性名表达式
1、ES6 允许字面量定义对象时,将表达式放在括号内。表达式还可以用于定义方法名:
[object Object]
三、super关键字
this
关键字总是指向函数所在的当前对象,ES6 又新增了另一个类似的关键字super
,指向当前对象的原型对象四、扩展运算符的应用
1、在解构赋值中,未被读取的可遍历的属性,分配到指定的对象上面:
2、解构赋值是浅拷贝。对象的扩展运算符等同于使用Object.assign()
方法
五、属性的遍历
1、ES6 一共有 5 种方法可以遍历对象的属性:
2、上述遍历,都遵守同样的属性遍历的次序规则:
六、对象新增的方法
1、Object.is():严格判断两个值是否相等,与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是+0
不等于-0
,二是NaN
等于自身
2、Object.assign():
Object.assign()
方法用于对象的合并,将源对象source的所有可枚举属性,复制到目标对象targetObject.assign()
方法的第一个参数是目标对象,后面的参数都是源对象Object.assign()
方法是浅拷贝,遇到同名属性会进行替换3、Object.getOwnPropertyDescriptors():返回指定对象所有自身属性(非继承属性)的描述对象
4、Object.setPrototypeOf():用来设置一个对象的原型对象
5、Object.getPrototypeOf():用于读取一个对象的原型对象
6、Object.keys():返回自身的(不含继承的)所有可遍历(enumerable)属性的键名的数组
7、Object.values():返回自身的(不含继承的)所有可遍历(enumerable)属性的键对应值的数组
8、Object.entries():返回一个对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对的数组
9、Object.fromEntries():用于将一个键值对数组转为对象
一、参数
1、ES6
允许为函数的参数设置默认值:
let
或const
再次声明x
和y
就不会生成,从而报错,这里设置默认值避免二、属性
1、length:
length
将返回没有指定默认值的参数个数rest
参数也不会计入length
属性length
属性也不再计入后面的参数了2、name:
name
属性都返回这个具名函数原本的名字构造函数返回的函数实例,
name属性的值为
anonymousbind
返回的函数,name
属性值会加上bound
前缀三、作用域
1、一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域
2、等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的
四、严格模式
五、箭头函数
1、如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分
2、如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return
语句返回
3、如果返回对象,需要加括号将对象包裹
4、注意点:
this
对象,就是定义时所在的对象,而不是使用时所在的对象new
命令,否则会抛出一个错误arguments
对象,该对象在函数体内不存在。如果要用,可以用rest
参数代替yield
命令,因此箭头函数不能用作 Generator 函数一、定义
1、Set
是一种叫做集合的数据结构,Map
是一种叫做字典的数据结构
2、什么是集合和字典:
3、区别:
二、Set
1、Set
是es6
新增的数据结构,类似于数组,但是成员的值都是唯一的,没有重复的值,我们一般称为集合
Set
本身是一个构造函数,用来生成 Set 数据结构2、增删改查:
Set
结构本身。当添加实例中已经存在的元素,set
不会进行处理添加Set
的成员2、遍历:
3、Set
的遍历顺序就是插入顺序:
keys
方法、values
方法、entries
方法返回的都是遍历器对象Set
结构相结合实现数组或字符串去重三、Map
1、Map
类型是键值对的有序列表,而键和值都可以是任意类型
Map
本身是一个构造函数,用来生成Map
数据结构2、增删改查:
size
属性返回 Map 结构的成员总数。key
对应的键值为value
,然后返回整个 Map 结构。如果key
已经有值,则键值会被更新,否则就新生成该键。同时返回的是当前Map
对象,可采用链式写法方法读取
key对应的键值,如果找不到
key,返回
undefinedhas
方法返回一个布尔值,表示某个键是否在当前 Map 对象之中方法删除某个键,返回
true。如果删除失败,返回
falseclear
方法清除所有成员,没有返回值3、遍历:
4、遍历顺序就是插入顺序
四、WeakSet
1、WeakSet
可以接受一个具有Iterable
接口的对象作为参数
2、在API
中WeakSet
与Set
有两个区别:
API
size
属性3、WeackSet
只能成员只能是引用类型,而不能是其他类型的值
4、WeakSet
里面的引用只要在外部消失,它在WeakSet
里面的引用就会自动消失
五、WeakMap
1、WeakMap
结构与Map
结构类似,也是用于生成键值对的集合
2、在API
中WeakMap
与Map
有两个区别:
API
clear
清空方法3、WeakMap
只接受对象作为键名(null
除外),不接受其他类型的值作为键名
4、WeakMap
的键名所指向的对象,一旦不再需要,里面的键名对象和所对应的键值对会自动消失,不用手动删除引用
一、定义
1、Promise
,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大
2、状态:pending
(进行中)、fulfilled
(已成功)、rejected
(已失败)
二、优点
三、特点
pending
变为fulfilled
和从pending
变为rejected
),就不会再变,任何时候都可以得到这个结果四、用法
1、Promise
对象是一个构造函数,用来生成Promise
实例:
const promise = new Promise(function(resolve, reject) {});
2、Promise构造函数接受一个函数作为参数,该函数的两个参数分别是
resolve和
reject:
resolve
函数的作用是,将Promise
对象的状态从“未完成”变为“成功”reject
函数的作用是,将Promise
对象的状态从“未完成”变为“失败3、实例方法:Promise
构建出来的实例存在以下方法
then
是实例状态发生改变时的回调函数,第一个参数是resolved
状态的回调函数,第二个参数是rejected
状态的回调函数catch()
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数finally()
方法用于指定不管 Promise 对象最后状态如何,都会执行的操作4、构造函数方法:Promise
构造函数存在以下方法
Promise.all()
方法用于将多个Promise
实例,包装成一个新的Promise
实例Promise.race()
方法同样是将多个 Promise 实例,包装成一个新的 Promise 实Promise.allSettled()
方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例Promise
对象方法也会返回一个新的 Promise 实例,该实例的状态为
rejected五、使用场景
Promise
,一旦加载完成,Promise
的状态就发生变化then
,让其各司其职。或当下个异步请求依赖上个请求结果的时候,我们也能够通过链式操作友好解决问题all()
实现多个请求合并在一起,汇总所有请求结果,只需设置一个loading
即可race
可以设置图片请求超时一、定义
1、Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同
2、执行Generator
函数会返回一个遍历器对象,可以依次遍历Generator
函数内部的每一个状态
二、特征
1、function
关键字与函数名之间有一个星号
2、函数体内部使用yield
表达式,定义不同的内部状态
三、异步解决方案
1、回调函数:所谓回调函数,就是把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,再调用这个函数
2、Promise:Promise
就是为了解决回调地狱而产生的,将回调函数的嵌套,改成链式调用
3、generator:yield
表达式可以暂停函数执行,next
方法用于恢复函数执行,这使得Generator
函数非常适合将异步任务同步化
4、async/await:将上面Generator
函数改成async/await
形式,更为简洁,语义化更强了
5、区别:
promise
和async/await
是专门用于处理异步操作的Generator
并不是为异步而设计出来的,它还有其他功能(对象迭代、控制输出、部署Interator
接口…)promise
编写代码相比Generator
、async
更为复杂化,且可读性也稍差Generator
、async
需要与promise
对象搭配处理异步情况async
实质是Generator
的语法糖,相当于会自动执行Generator
函数async
使用上更为简洁,将异步代码以同步的形式进行编写,是处理异步编程的最终方案一、定义
二、本质
1、修改的是程序默认形为,就形同于在编程语言层面上做修改,属于元编程(meta programming)
2、Proxy
亦是如此,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)
三、用法
1、Proxy
为 构造函数,用来生成Proxy
实例
var proxy = new Proxy(target, handler)
2、参数:
target
表示所要拦截的目标对象(任何类型的对象,包括原生数组,函数,甚至另一个代理))handler
通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理p
的行为四、使用场景
1、Proxy
其功能非常类似于设计模式中的代理模式,常用功能如下:
2、使用Proxy
保障数据类型的准确性:
apiKey
,便于api
这个对象内部的方法调用,但不希望从外部也能够访问api._apiKey
3、观察者模式(Observer mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行:
observable
函数返回一个原始对象的Proxy
代理,拦截赋值操作,触发充当观察者的各个函数4、观察者函数都放进Set
集合,当修改obj
的值,在会set
函数中拦截,自动执行Set
所有的观察者
一、定义
1、模块:
2、原因:
二、方案
1、CommonJs(典型代表:node.js早期):
2、AMD(典型代表:require.js):
3、CMD(典型代表:sea.js):
4、ES6 Module:
一、定义
1、Decorator,即装饰器,从名字上很容易让我们联想到装饰者模式:
2、ES6
中Decorator
功能亦如此,其本质也不是什么高大上的结构,就是一个普通的函数,用于扩展类属性和类方法:
二、用法
1、类的装饰:当对类本身进行装饰的时候,能够接受一个参数,即类本身
2、类属性的装饰:当对类属性进行装饰的时候,能够接受三个参数
3、注意:装饰器不能用于修饰函数,因为函数存在变量声明情况
三、使用场景
1、基于Decorator
强大的作用,我们能够完成各种场景的需求,下面简单列举几种
2、使用react-redux
的时候,如果写成下面这种形式,既不雅观也很麻烦:
class MyReactComponent extends React.Component {}
?
export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent);
3、通过装饰器就变得简洁多了:
@connect(mapStateToProps, mapDispatchToProps)
export default class MyReactComponent extends React.Component {}
4、将mixins
,也可以写成装饰器,让使用更为简洁了:
function mixins(...list) {
?return function (target) {
? ?Object.assign(target.prototype, ...list);
};
}
?
// 使用
const Foo = {
?foo() { console.log('foo') }
};
?
@mixins(Foo)
class MyClass {}
?
let obj = new MyClass();
obj.foo() // "foo"
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦