ES和JS的关系:创造JS的公司Netscape把JS交给了国际标准化组织ECMA希望JS能成为国际标准,次年(1997)年ECMA发布ECMAScript 1.0版本。
不叫JS而叫ES的原因是:1.JS是Netscape公司注册的 2.为保证语言的开放性和中立性,体现语言的制定者是ECMA而不是Netscape
ES发展的历史到现在将近22年,从1997年的ES1.0 开始3.0是一个巨大的成功,现在的JS的基本语法就是3.0版本的语法。2000年4.0开始酝酿,由于太激进没有被发表,但是一直酝酿到2015年,出版了ES6。
块级作用域:{}
为什么需要块级作用域:由于变量提升内层变量可能会覆盖外层变量; 用于计数的循环变量泄漏为全局变量
Let不存在变量提升:所谓变量提升就是函数及变量的声明都将被提升到函数的最顶部。因此在代块内使用let命令声明变量前该变量都是不可使用的
Const命令只是保证变量指向的地址不变不能保证地址的数据不变。也就是说可以给数据添加属性。
ES6有6种声明方法:var const let function import class
可遍历结构:具备一个叫做Iterator的接口,包括数组,类似数组的对象,set和map;
Set:类似于数组,但是成员的值都是唯一的,没有重复的值。数组去重可以用。Map:键值对的数据结构
在ES6 内部按照严格相等判断一个位置是否有值,如果一个数组成员不严格等于undefined,默认值是不会生效的。
比如var [x=1]=[null]; x//null null==undefined//true
如果默认值是一个表达式,那么这个表达式是惰性求值的。只有在用到的时候才会求值
类似于数组的对象都有length属性,因此还可以对length属性进行解构赋值
JS内部以UTF-16储存,每个字符是两个字节,Unicode大于0XFFFF的用四个字节储存,JS就会认为是两个字符。
原本采用\u20BB7 JS认为是\u20BB+7 ES6对此进行了改正,只要将码点放入大括号就能正确解读字符
对于一个码点大于0xFFFF的字符,JS会判断它的长度为2,因此charCodeAt()只能返回前两个字节和后两个字节
ES6提供了codePointAt的方法,能够正确处理四个字节储存的字符,返回一个字符的码点,第二次返回这个字符的后两个字节的码点。
ES5提供了string.fromCharCode()方法,用于从码点返回对应的字符串,但是这个方法不能识别32位的UTF-16字符,也就是Unicode大于0xFFFF,当大于0xFFFF时就会发生溢出,最高两位会被舍弃。
如果该方法有多个参数,它们将会被合并成一个字符串返回。
codePointAt()和fromCodePoint()的区别:前者定义在字符串的实例上,后者定义在string对象上。
at()方法是针对charAt()提出的,用于返回字符串给定位置的字符,但是后者不能识别码点大于0xFFFF的字符
ES6对indexOf()进行了扩展,indexof()返回某个字符串值在字符串中首次出现的位置没出现过就返回-1
这三个方法都支持第二个参数n,表示开始搜索的位置,但是endsWith()针对的是前N个字符
如果repeat的参数是负数或者Infinity就会报错
如果参数是0到-1之间的小数,。就等同于0;
如果参数为NaN就等同于0
如果repeat的参数是字符串就先转换为数字
下面两个是字符串补全长度的功能,如果某个字符串没达到指定长度就会在头部或尾部补全,前者补头部后者补尾部,接受两个参数,第一个参数指定字符串的最小长度,第二个参数是用来补全的字符串。如果省略第二个参数,就用空格补全。
Number.isInteger():判断一个数是否为整数
Math.trunc():去除小数, 先用Number()转化,空值和无法截取的整数值返回NaN
Math.sign()判断一个数是正数负数还是零,整数返回+1,负数返回-1,0返回0,-0返回-0
Math.cbrt():计算一个数的立方根,先用Number转换
Math.imul():两个数以32位带符号整数形式相乘的结果(小数相乘),与a*b结果相同,不能超过+-2^53
Math.hypot():返回所有参数的平方和的平方根,只要一个参数无法转化为数值就会返回NaN
对数方法:Math.expm1(X):返回e^x -1
Math.log1p(X):返回ln(1+x)
Math.log10(X):返回以十为底X的对数
Math.log2():返回以2为底的X的对数,如果X小于0.就返回NaN
还有三角函数方法,X的正弦、余弦、正切、双曲正弦、双曲余弦、双曲正切
指数运算:** 2**2//2^2 2**3//2^3
let arr2=Array.from(arrayLike);
Array.from()还可以将字符串转换为数组,然后返回字符串的长度,Array.from(string).length,可以处理各种字符,包括Unicode大于\uFFFF的字符
Array.of(3,11,8)//[3,11,8]
Array.of()主要是为了弥补数组构造函数Array()的不足,Array的不足: 当Array()的参数的个数大于2时才回去返回由参数组成的新数组,当参数只有一个时指的是数组的长度。
三个参数都是数值,如果不是数值会自动转换为数值。
数组实例的fill():使用给定值填充数组,['a','b','c'].fill(7)//[7,7,7], 还可以接收第二个和第三个参数,用于指定填充的起始位置和结束位置
数组实例的entries(),keys(),values()用于遍历数组,返回一个遍历器对象,可用for...of循环遍历,区别:第一个是对键名的遍历,values()是对键值的遍历,entries()是对键值对的遍历。
数组实例的includes()Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,第二个参数表示搜索的起始位置,默认为0,如果第二个参数为负数,就表示倒数的位置,如果此位置超出数组长度就会重置从0开始
indexOf()的缺点:误判NaN
数组推导:通过现有的数组生成新数组
var a1=[1,2,3,4];
var a2=[for(i of a1) i*2];
a2//[2,4,6,8];
在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法(传参之后检验参数有没有值,没有的话怎么处理,给定一个参数) 但是有缺点,缺点就是如果一个参数是空字符,还是可以修改成默认值
函数length属性的含义:该函数预期传入的参数个数,某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。
函数的length属性:返回没有指定默认值的参数的个数,指定了默认值之后length属性将失真
作用域: 如果参数默认值是一个变量,先当前后全局
var x=1;
function(x,y=x){
console.log(y);
}
f(2);
扩展运算符:...将一个数组转为用逗号分隔的参数序列
可以将字符串转为真正的护士组
name属性返回函数的函数名
一个匿名函数如果赋值给一个变量name属性返回变量名。
ES6允许直接写入变量和函数作为对象的属性和方法
object.is():比较两个值是否严格相等,与===不同的是,+0不等于-0,NaN=NaN
object.assign():将所有可枚举属性复制到目标对象,两个参数,第一个是目标对象,后面所有的参数都是源对象只要有一个参数不是对象就会报错
如果目标对象与源对象有同名属性,后面的属性会覆盖前面的属性
Object.assign():只复制自身属性,不可枚举的属性和继承的属性不会被赋值
ES6的六种遍历对象属性的方法:for...in object.keys(obj) object.getOwnPropertyNames(obj) Object.getOwnPropertySymbols(obj) Reflect.ownKeys(obj)
Reflect.enumerate(obj)
观察者模式:函数自动观察数据对象的模式,一旦对象有变化,函数就自动执行
Proxy:修饰某些操作的默认行为,也可以理解为在目标对象前假设一个拦截层,外界对该对象的访问都必须先通过这层拦截,可以利用这种机制对外界的访问进行过滤和改写。
与Proxy相同,也是ES6新增。
它新增了一些方法,这些方法可以使一些操作更加规范化,更加便利。对象有如下特点:
(1).只要Proxy对象具有的代理方法,Reflect对象全部具有,以静态方法的形式存在。这些方法能够执行默认行为,无论Proxy怎么修改默认行为,总是可以通过Reflect对应的方法获取默认行为。
(2).新增的方法与现有一些方法功能重复,新增的方法会取代现有的方法。比如Reflect.getPrototypeOf(),Object对象具有同样的方法,功能也相同,但是将getPrototypeOf()方法移植到Reflect更加合理。还有一些新增方法用来取代现有的命令式操作,比如判断属性是否存在的in命令,用Reflect.has()方法替代。
get():拦截某个属性读取操作
set():拦截某个属性的赋值操作
apply():拦截函数的调用,call和apply操作
has:隐藏某些属性不被In操作符发现
deleteProperty():拦截delete操作,如果返回false或者抛出错误就表明不能被delete命令删除
enumerate():用于拦截for...in循环,
getOwnPropertyDescriptor():拦截Object.getOwnPropertyDescriptor返回一个属性描述对象或者undefined
getPrototypeOf():拦截Object.getPrototypeOf()运算符,以及一些其他的
setProtorypeOf():拦截Object.setProtorypeOf()
Proxy.revocable():返回一个可取消的Proxy实例
Set.prototype.size:返回Set实例的成员总数。
四个操作方法。
add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。
4、Set结构的实例有四个遍历方法,可以用于遍历成员。
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
WeakSet与Set区别。
首先,WeakSet的成员只能是对象,而不能是其他类型的值。
其次,WeakSet中的对象都是弱引用,垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。
8、WeakSet的一个用处,是储存DOM节点,而不用担心这些节点从文档移除时,会引发内存泄漏。
唯一的区别是它只接受对象作为键名(null除外),不接受其他类型的值作为键名,而且键名所指向的对象,不计入垃圾回