ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的惟一属性名。正则表达式
a = Symbol('sss')
b = Symbol('sss')
a === b //false
复制代码
返回由给定的 key 找到的 symbol,不然就是返回新建立的 symbol。数组
Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key。安全
let sym = Symbol.for("foo")
Symbol.keyFor(sym) // "foo"
复制代码
ES6 引入了四种新的原始数据结构。bash
ES6 提供了新的数据结构 Set。它相似于数组,可是成员的值都是惟一的,没有重复的值。数据结构
首先,WeakSet 的成员只能是对象,而不能是其余类型的值。app
其次,WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,若是其余对象都再也不引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。(WeakMap同)函数
它相似于对象,也是键值对的集合,可是“键”的范围不限于字符串,各类类型的值(包括对象)均可以看成键。ui
首先,WeakMap只接受对象做为键名(null除外),不接受其余类型的值做为键名。this
其次,WeakMap的键名所指向的对象,不计入垃圾回收机制。spa
Map和Set中对象的引用都是强类型化的,并不会容许垃圾回收。这样一来,若是Map和Set中引用了再也不须要的大型对象,如已经从DOM树中删除的DOM元素,那么其回收代价是昂贵的。WeakMap和WeakSet储存 DOM节点,而不用担忧这些节点从文档移除时,会引起内存泄漏。
Proxy 与 Reflect 是 ES6 为了操做对象引入的 API 。
Proxy 能够对目标对象的读取、函数调用等操做进行拦截,而后进行操做处理。它不直接操做对象,而是像代理模式,经过对象的代理对象进行操做,在进行这些操做时,能够添加一些须要的额外操做。
let handle = {
get: function(target,key){
console.log('setting' + key)
return target[key] // 不是target.key
},
set: function(target, key, value) {
console.log('setting ' + key)
target[key] = value
}
}
let proxy = new Proxy(target, handler)
proxy.name // 实际执行 handler.get
proxy.age = 25 // 实际执行 handler.set
// getting name
// setting age
// 25
复制代码
try {
Object.defineProperty(target, property, attributes)
// success
} catch (e) {
// failure
}
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
复制代码
// 老写法
'assign' in Object // true
// 新写法
Reflect.has(Object, 'assign') // true
复制代码
Proxy(target, {
set: function(target, name, value, receiver) {
var success = Reflect.set(target, name, value, receiver)
if (success) {
console.log('property ' + name + ' on ' + target + ' set to ' + value)
}
return success
}
})
复制代码
三个方法均可以接受两个参数,须要搜索的字符串,和可选的搜索起始位置索引。
这三个方法只返回布尔值,若是须要知道子串的位置,仍是得用 indexOf 和 lastIndexOf 。
repeat():返回新的字符串,表示将字符串重复指定次数返回。
'x'.repeat(3) // "xxx"
复制代码
接受两个参数,第一个参数是指定生成的字符串的最小长度,第二个参数是用来补全的字符串。若是没有指定第二个参数,默认用空格填充。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
复制代码
它们的行为与trim()一致,trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。
标签模板是一个函数的调用,其中调用的参数是模板字符串。
alert`Hello world!`
// alert('Hello world!')
复制代码
ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。
它们与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,对于非数值一概返回false。
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为彻底保持不变。
Number.isInteger()用来判断一个数值是否为整数。
ES6 在Number对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。
JavaScript 可以准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,没法精确表示这个值。 Number.isSafeInteger()则是用来判断一个整数是否落在这个范围以内。
ES6 在 Math 对象上新增了 17 个数学相关的静态方法,这些方法只能在 Math 中调用。
1 ** 2 // 1
2 ** 2 ** 3 // 256
复制代码
Array.from()
Array.from方法用于将两类对象转为真正的数组:相似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
// ES5的写法
var arr1 = [].slice.call(arrayLike) // ['a', 'b', 'c']
// ES6的写法
let arr2 = Array.from(arrayLike) // ['a', 'b', 'c']
复制代码
Array.of()
Array.of方法用于将一组值,转换为数组。
Array.of(3, 11, 8) // [3,11,8]
复制代码
find:用于找出第一个符合条件的数组成员,而后返回该成员。若是没有符合条件的成员,则返回undefined。
findIndex:返回第一个符合条件的数组成员的位置,若是全部成员都不符合条件,则返回-1。
[1, 4, -5, 10].find((n) => n < 0) // -5
[1, 4, -5, 10].findIndex((n) => n < 0) //2
复制代码
copyWithin(target, start, end)
数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其余位置(会覆盖原有成员),而后返回当前数组。参数1:被修改的起始索引,参数2:被用来覆盖的数据的起始索引,参数3(可选):被用来覆盖的数据的结束索引,默认为数组末尾。
[1, 2, 3, 4, 5].copyWithin(0, 3, 4) // [4, 2, 3, 4, 5]
复制代码
fill(value, start, end)
fill方法使用给定值,填充一个数组。
['a', 'b', 'c'].fill(7, 1, 2) // ['a', 7, 'c']
复制代码
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法相似。
[1, 2, 3].includes(2) // true
复制代码
flat()用于将嵌套的数组“拉平”,变成一维的数组。flat()方法的参数是一个整数,表示想要拉平的层数,默认为1。
flatMap()方法对原数组的每一个成员执行一个函数,而后对返回值组成的数组执行flat()方法。
[1, 2, [3, [4, 5]]].flat(2) // [1, 2, 3, 4, 5]
[2, 3, 4].flatMap((x) => [x, x * 2]) // [2, 4, 3, 6, 4, 8]
复制代码
const foo = 'bar'
const baz = {foo}
baz // {foo: "bar"}
// 等同于
const baz = {foo: foo}
复制代码
super 关键字
关键字super,指向当前对象的原型对象。
Object.is(value1, value2)
用来比较两个值是否严格相等,与(===)基本相似。
Object.assign()
用于对象的合并,将源对象(source)的全部可枚举属性,复制到目标对象(target)。
const target = { a: 1 }
const source1 = { b: 2 }
const source2 = { c: 3 }
Object.assign(target, source1, source2)
target // {a:1, b:2, c:3}
复制代码
Object.getOwnPropertyDescriptors()
返回指定对象全部自身属性(非继承属性)的描述对象。
Object.setPrototypeOf(),Object.getPrototypeOf()
设置或读取一个对象的原型对象。
Object.keys(),Object.values(),Object.entries()
返回一个数组,成员是参数对象自身的(不含继承的)全部可遍历(enumerable)属性的键名/键值/键值对数组
Object.fromEntries()
Object.fromEntries()方法是Object.entries()的逆操做,用于将一个键值对数组转为对象。