一 let与const
- let声明变量只在它所在的代码块中有效
- let不存在变量提升:只能先声明再使用变量
- 暂时性死区:只要块级作用域内存在let或const命令,它所声明的变量就不再受外部影响,即使在外定义了相同变量名的全局变量。
- 不允许重复定义变量
- 块级作用域:在块级作用域中可以定义函数(5不行),但函数作用范围与let相同
- do表达式:块级作用域没有返回值。let aaa = do{};则大括号里面内容有返回值赋给aaa。
- const声明一个只读变量,不可更改,所以const声明的变量必须立刻初始化。
- const的本质:变量指向的内存地址不可改变,如:const foo={};foo.prop=123;就可以改变
二 变量的解构赋值
- 例:let [a,b,c] = [1,2,3]; //a=1,b=2,c=3
- 不仅可以用于数组还可以用在对象:let {foo,bar} = {foo:’aaa’,bar:’bbb’}
三 字符串的扩展
- includes():返回布尔值,表示是否找到了参数字符串
- startsWith():返回布尔值,表示参数字符串是否在源字符串的头部
- endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部
以上三种都支持第二参数,表示开始搜索的位置(endwith与其他两个相反,参数指的是前xx个字符,第一个字符为1) - repeat():返回一个新字符,表示为原字符重复了n次。例:x.repeat(3)
- padStart(),padEnd():字符串补全长度,两个参数:第一个指定字符串最小长度,第二个指定用来补全的字符串。如果第二个参数省略则用空格补全。
- 模板字符串:用前后两个(`)做标识,变量和js表达式和函数放在($())内。
- 模板编译函数:compile()
四 数值的扩展
- Number.isNaN()和Number.isFinite():判断数值是否为nan/有限,如果是非数值一律为false
- Number.parseInt()和Number.parseFloat():将原先的全局对象移植到Number对象。
- Number.isInteger():判断一个数值是否为整数。
- Number.EPSILON():Number对象上增加的一个极小常量。
- Number.isSafeInteger():判断是否超出js数字最大范围。
- Math.trunc():用于去除一个数的小数部分,返回其整数部分。
- Math.sign():用来判断一个数是正数、负数还是零。(正数返回1,负数-1,0两种情况,其它值返回NaN)
- Math.cbrt():用于计算一个数的立方根。
- Math.clz32():返回一个数的32位无符号整数形式有多少个前导零。
- Math.imul():计算大数值相乘时更为精确。
- Math.fround():返回一个数的单精度浮点数形式。
- Math.hypot():返回所有参数平方和的平方根。
- Math.expm1(x):返回e的x次方减1。
- Math.log1p(x):返回1+x的自然对数。以e为底。
- Math.log10(x):返回以10为底的x的对数。
- Math.log2():同上
**
:指数运算符。
五 数组的扩展
- Array.from():将类似数组的对象(有length属性)和可遍历对象转化为真正的数组。他还可以接受第二参数,作用类似map方法,用来对每个元素进行处理,将结果放回数组。
- Array.of():将一组值转化为字符串,对比Array()可以生成小于两个参数的数组。
- copyWithin():将指定位置的成员复制到其他位置(会覆盖原有成员),并返回当前数组。
三个参数:第一个:从该位置替换数据,第二个:从该位置开始读取数据,第三个:到该位置前停止读取,默认等于数组长度。 - find():他的参数是一个回调函数,找到第一个返回true的成员,返回该成员。没找到返回undefined。
- findIndex():同上,返回该成员的索引,没有找到返回-1。
- fill()方法:使用给定值,填充一个数组。第二第三个参数分别是起始位置和结束位置。
- entries(),keys(),values()方法:用于遍历数组,key对键名的遍历,values对键值的遍历,entries对键值对的遍历。(一般使用for…of遍历)
- includes()方法:返回一个布尔值,表示数组是否包含有给定值。与has方法区别:may的has用来查找键名,set的has用来查找键值
六 函数的扩展
- 函数默认值:function aaa(x,y=”bbb”){};
- 函数的length属性:指的是函数参数的个数,如果参数设置了默认值,则该参数以及其后的参数都不计入length中。
- 函数声明初始化时,参数会形成一个单独的作用域,不设置参数默认值时则不出现。
rest参数:语法:…变量名。将多余参数化作数组。例:
function add(…values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10扩展运算符:语法:…数组。与rest参数相反,将一个数组转为用逗号分隔的参数序列
用处:一 替代apply方法:aaa(…[1,2,3]) 等同于 aaa.apply(null,[1,2,3])
二 合并数组:[1,2,…more]
三 字符串转为数组:[…’hello’]——可以识别32位unicode字符函数name属性:函数的name属性,返回该函数的函数名
- 箭头函数:语法:函数名 = 参数值 => 返回值。如果返回值多于一条语句则用{}括起并用return返回返回值。由于{}解释为代码块所以当返回对象{}的话要用()括起。
七 对象的扩展
- Object.is():同值相等判断,基本等于===,不同于其NaN等于自身,+0不等于-0
- Object.assign():将源对象所有可枚举属性加入目标对象。第一个参数为目标对象,后面的参数全为源对象。
- 可枚举属性(enumerable):值为布尔值。for…in等操作会忽视不可枚举属性(false)
- 对象属性的遍历:
- for…in:循环遍历对象自身的和继承的可枚举属性
- Object.keys(obj):返回一个数组,包括对象自身的(不含继承)所有可枚举属性的键名。
- Object.getOwnPropertyNames(obj):返回一个数组,包含对象自身的所有属性。
- Object.getOwnPropertySymbols(obj):返回一个数组,包含对象自身的所有Symbol属性
- Reflect.ownKeys(obj):返回一个数组,包含对象自身的所有属性
1到3条都不返回Symbol属性,4,5条则都会返回。
- proto属性,Object.setPrototypeof(),Object.getPrototypeOf():前两个作用相同,用来设置一个对象的prototype对象,返回参数对象本身。(第一个参数为对象,第二个为原型)
第三个方法用于读取一个对象的原型对象 - Object.keys():返回一个数组,包括对象自身的(不含继承的)所有可枚举属性的键名。
- Object.values():返回一个数组,包括对象自身的(不含继承的)所有可枚举属性的键值。
- Object.entries():返回一个数组,成员是参数对象自身的(不含继承的)所有可枚举属性的键值对数组。
以上三种主要搭配for…of使用。例:for(let [k,v] of Object.entries(xxx)){} - Object.getOwnPropertyDescriptors():返回某个对象属性的描述对象。即返回不显式注明的enumerable等属性。
- Null传导运算符(?.):读取对象内部属性时使用。例:let fn = mes?.body?.user || ‘default’
只要任一个属性不存在则不再运算,返回undefined。
八 Symbol
- 他是js语言的第七种数据类型,用来表示独一无二的值。
- Symbol值通过Symbol函数生成。例:let s = Symbol()。该函数可以接受一个字符串作为参数,用来表示对Symbol实例的描述。
- 使用Symbol值定义属性时,Symbol值必须放在方括号中。否则就代表了字符串而非Symbol值
- Symbol.for():接受一个字符串作为参数,然后搜索是否有以此参数为名的Symbol值。如果有,返回这个值,否则新建并返回一个以该字符串为名称的Symbol值。
- Symbol.keyFor():返回一个已登记Symbol值得key。例:var s1 = Symbol.for(‘foo’);
symbol.keyFor(s1) // “foo” - Symbol具体的各种属性:…
九 Set和Map数据结构
- Set是一种新的数据结构。类似于数组,但成员都是唯一的值。语法:var s = new Set();
- 向Set加入值得时候不会发生类型转换。另外两个对象总是不相等的。
- Set实例的属性和方法:属性:Set.size:返回set实例的成员总数。
方法:Set.add():添加某个值,返回Set结构本身。Set.delete():删除某个值,返回一个布尔值,表示删除是否成功。Set.has():返回一个布尔值,表示该值是否为Set的成员。Set.clear():清除所有成员,没有返回值。 - Array.from()方法可以将Set结构转化为数组。
- WeakSet:结构与Set类似,也是不重复的值的集合。不同1:它的成员只能是对象。不同2:它之中的对象都是弱引用,因此它是不可遍历的。
- WeakSet的三个方法:.add() .delete() .has() 作用与set的对应方法类似
- Map结构:类似于对象,也是键值对的集合,但key的范围不限于字符串。也就是说Object结构提供了字符串-值得对应。map结构提供了值-值的对应。
- map的属性和操作方法:
属性:size:返回Map结构的成员总数。
方法:set(key,value):设置key所对应的键值,然后返回整个Map结构。
get(key):读取key对应的键值。has(key): delete(key): clear(): - map的遍历:默认遍历接口entries。keys()、values()、entries()、forEach()。其中map的forEach方法接受第二参数,用来绑定this。即它的回调函数的this只想第二个参数。
- 与其他数据结构的互相转换
- 数组:[…map]
- 数组到map:new Map([xxx,xxx,xxx])
- 对象:如果map的键全为字符串,则可以转化为对象。
- 对象到map:与3相反就行了。
- JSON:键名是字符串先转化为对象再用JSON.stringify()转化。键名不是字符串,可以选择转为数组JSON:JSON.stringify([…map])
- JSON到map:先转化为对象或数组,再转化为map结构(JSON.parse())
- WeakMap:与map结构区别:只接受对象作为键名,且不计入垃圾回收机制,不可遍历。最后,他无法被清空。
十 Proxy和Reflect
- 先跳过
十一 Promise对象
- Promise对象是一个构造函数,用来生成Promise实例,用来保存某个未来才会结束的事件如一个异步操作。语法:
var promise = new Promise(function(resolve,reject){
if(异步操作成功:200){resolve(value)}else{reject(error)}
}) - promise实例的两个参数resolve和reject是两个函数,作用是将对象状态从未完成变为成功或失败。
- Promise实例的then方法:指定resolved状态和reject状态的回调函数。promise实例在新建后就立刻执行,then则是在执行完当前脚本所有的同步任务后再输出。
- catch方法:用于指定发生错误时的回调函数。一般来说,不在then方法里定义reject回调函数,而用catch。因为状态改变后就不再抛出错误,也无法被catch捕获了。
如果没用catch方法指定错误处理的回调函数,Promise实例的错误则不会有任何反应 - all方法:语法:var p = Promise.all([p1,p2,p3]);
它接受一个数组作为参数,将多个Promise实例,包装成一个新的Promise实例。
p的状态由p1、2、3决定,只有全fulfilled,p才会fulfilled。只要有一个rejected,p就rejected。
例子:var promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON(“/post/“ + id + “.json”);
});
Promise.all(promises).then(function (posts) {
}).catch(function(reason){
}); - race方法:与all方法相同将多个Promise实例,包装成一个新的Promise实例。
p的状态只要有一个实例率先改变状态,p的状态就改变。 - resolve方法:将现有对象转化为Promise对象。基本都是转化为resolved状态的promise实例,并立刻执行回调函数。
- reject方法:与上面方法相同,不同的是promise实例的状态为rejected
十二 Iterator和for…of循环
- Iterator:所有部署了Symbol.iterator属性的数据结构。
- Iterator对象除了next方法,还有return和throw方法
return函数当for…of循环提前退出时调用(必须返回对象)
throw方法一般用不到 - for…in只能获得键名,for…of允许遍历获得键值
十三 Generator函数的语法
- Generator函数语法:一:function关键字与函数名之间有一个 * 二:函数体内部使用yield语句,定义不同的内部状态。
- Generator函数调用方法与普通函数相同,但调用后不执行,返回的也是一个遍历器对象。
- 需要调用函数必须调用next方法,使指针移向下一个状态。即yield语句是暂停标记,next可以恢复执行。yield与return差别在于它具有记忆位置的功能,下个next会从之前一个yield开始。用过next方法以后返回一个对象,其value属性为yield之后的表达式的值,done属性为函数有没有结束。
- yield只能用在generator函数中。且如果要用在表达式中必须用括号括起。
- next方法如果带参数则参数就为上一个yield的值。
- for…of循环遍历Generator函数:不需要调用next,当done属性为ture循环结束。例如用了return语句。
- throw方法:try/catch
- return方法:返回值并终结generator函数使其done属性变为true,以后再调用next,done属性也总返回true。如果函数内有try…finally代码块,则return会推迟到该代码块加载完在执行
- yield语句:默认情况下无法再Generator函数内调用另一个Generator函数,而用`yield`语句后则可以跟Generator函数
- Generator函数的this:G函数的总是返回一个遍历器,this函数无法指向该函数。要设定函数内属性要用G.prototype。他也不能用new命令,因为他不是构造函数。要获得正常的this需要用call方法绑定G函数内部的this。例:var f = F.call(F.prototype)。这样就能取到函数内的this了。
十四 Module的语法
- export命令:可以输出变量,类和函数。可以用as关键字重命名。
- import命令:接受一对大括号,里面指定要从其他模块导入的变量名。也可以用as来重命名
- 模块整体加载:import * from
- export default命令:为模块指定默认输出。import可以任意命名。
- export与import的复合写法:即先输入后输出同一模块。export {} form ‘’
- 模块的继承:
export * from 'circle'
。表示再输出circle模块的所有属性和方法。注意,export *
命令会忽略circle模块的default方法。 - 跨模块常量:export const A = xxx;多个常量的话:export const db = {url:xxx,name:aaa}