一、ES5与ES6对比
var let const
1、ES5 声明局部变量必须使用一个立即执行函数,而ES6 使用{}+let;
2、使用var会变量提升,而使用let不会,但是let有一个临时死区,就是在还未声明时调用会报错;
3、let 的作用域在最近的 {} 之间;
4、const声明局部常量,只有一次赋值的机会,必须在声明的时候赋值;
二、ES6新增的数据类型
ES6在原基础七种数据类型(number、string、boolean、symbol、undefined、null、object),在object上细分了几种数据类型。
symbol
静态属性和静态方法:静态属性是可以直接通过构造函数调用的属性,静态方法是调用函数。
总结:
1.Symbol()不能加new;
2.每一个Symbol()都是唯一;
3.创造私有属性,要再块级作用域以object[Symbol()] = ''保存;
object > set (Set是对象,可以储存任何类型的唯一值)
作用:
1.数组去重
(1)是对象;(2)存储的是唯一值;(3)对所有原始值进行去重;(4)对所有对象的引用可以去重;
ES6之前的数组去重:
ES6数组去重:
Set的方法:
new Set().add() new Set().has() new Set().delete()
object > map
new Map() 是弥补了只能将字符串作为key的缺点,new Map()可以将对象作为key;
object > weakSet
对对象弱引用,如果一个对象被垃圾回收,则null;没有办法列出所有的值;
三、ES6新增的API
Object.assign
深拷贝就是俩个对象没有任何交集,完美深拷贝是不可能的,因此Object.assign也是浅拷贝;
浅拷贝就是“=”,赋值,直接拷贝,不管其实际内存里有什么;
深拷贝就是完全拷贝,包括其地址,内存内的;
Object.assign是拷贝可枚举的属性,不可枚举的属性有toString(),__proto__。
Array.from
变数组,可将伪数组变数组;
ES 5 写法:a = Array.prototype.slice.call(a,0)
ES6 写法:
let s = new Set(['foo',window])
Array.from(s) // ["foo",window]
创建一个长度为5的空数组:
ES5:
Array.apply(null,{length:5})
ES6:
Array.from({length:5}) //创建一个长度为n的数组
Array.prototype.fill()
填充
Array.prototype.find()
Array.prototype.filter()
Array.prototype.findIndex
Array.prototype.copyWithin
Array.prototype.entries
Array.prototype.keys
Array.prototype.values
判断一个字符串是否包含在其中的四种方法:
string.indexOf()
String.prototype.includes //
string.search也可以,同时可以兼并正则;
string.match()
String.prototype.repeat
String.prototype.startsWith //以XX开头 可用xx.indexOf('x') === 0代替
String.prototype.endsWith //以XX结尾 可用xx.indexOf('x') === xx.length-1代替
Number.EPSILON // 看JS的最小误差
Number.isInteger //判断是否为整数
Number.isSafeInteger
Number.isFinite
Number.isNAN
parseInt的BUG