一、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():用于判断数组是否包含给定的值
06、flat(),flatMap():将数组扁平化处理,返回一个新数组,对原数据没有影响
flat():默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1flatMap()方法对原数组的每个成员执行一个函数相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。flatMap()方法还可以有第二个参数,用来绑定遍历函数里面的this四、数组的空位
1、数组的空位指,数组的某一个位置没有任何值
undefinedArray.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有两个区别:
APIsize属性3、WeackSet只能成员只能是引用类型,而不能是其他类型的值
4、WeakSet里面的引用只要在外部消失,它在WeakSet里面的引用就会自动消失
五、WeakMap
1、WeakMap结构与Map结构类似,也是用于生成键值对的集合
2、在API中WeakMap与Map有两个区别:
APIclear清空方法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._apiKey3、观察者模式(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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦