1.Function.prototype.toString()
ES2019 对函数实例的toString()
方法做出了修改。toString()
方法返回函数代码本身,以前会省略注释和空格。 修改后的toString()
方法,明确要求返回一模一样的原始代码。
function /* foo comment */ foo () {}
foo.toString()
// function foo() {}
function /* foo comment */ foo () {}
foo.toString()
// "function /* foo comment */ foo () {}"
2.Array.from()
Array.from
方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
实际应用中,常见的类似数组的对象是 DOM 操作返回的 NodeList 集合,以及函数内部的arguments
对象。Array.from
都可以将它们转为真正的数组。
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']
// NodeList对象
let ps = document.querySelectorAll('p');
Array.from(ps).filter(p => {
return p.textContent.length > 100;
});
// arguments对象
function foo() {
var args = Array.from(arguments);
// ...
}
3.Array.of()
Array.of
方法用于将一组值,转换为数组。 这个方法的主要目的,是弥补数组构造函数Array()
的不足。因为参数个数的不同,会导致Array()
的行为有差异。弥补什么呢,刚开始学习js的时候,循环语句看见有这种 new Array(10000)写法,会循环10000下,其实并没有10000,只有1个数字 所以Array.of 就弥补这种缺陷的
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
4. super关键字
this
关键字总是指向函数所在的当前对象,ES6 又新增了另一个类似的关键字super
,指向当前对象的原型对象。
const proto = {
foo: 'hello'
};
const obj = {
foo: 'world',
find() {
return super.foo;
}
};
Object.setPrototypeOf(obj, proto);
obj.find() // "hello"
// 注意,super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。
// 报错
const obj = {
foo: super.foo
}
// 报错
const obj = {
foo: () => super.foo
}
// 报错
const obj = {
foo: function () {
return super.foo
}
}
5.链判断运算符
编程实务中,如果读取对象内部的某个属性,往往需要判断一下该对象是否存在。比如,要读取message.body.user.firstName
,安全的写法是写成下面这样。
const firstName = (message
&& message.body
&& message.body.user
&& message.body.user.firstName) || 'default';
所以看着很麻烦,写着也比较繁琐,在ES2020推出了 ?. 运算符 直接在链式调用的时候判断,左侧的对象是否为null
或undefined
。如果是的,就不再往下运算,而是返回undefined
。
const firstName = message?.body?.user?.firstName || 'default';
6. Null 判断运算符
?? 运算符 相当于 || 表达式 当左侧为 null 或者 为undefined时候就 执行 右侧的值
const headerText = response.settings.headerText ?? 'Hello, world!';
const animationDuration = response.settings.animationDuration ?? 300;
const showSplashScreen = response.settings.showSplashScreen ?? true;
以上实例以及描述都来自于 10. 对象的扩展 - Null 判断运算符 - 《阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版》 - 书栈网 · BookStack 大家可以去看看 这本书写的很详细 如果侵权请联系我进行删除
7.__proto__
属性
__proto__
前后的双下划线,说明它本质上是一个内部属性 ,因此 无论从语义的角度,还是从兼容性的角度,都不要使用这个属性,应该使用 Object.setPrototypeOf()
(写操作)、Object.getPrototypeOf()
(读操作)、Object.create()
(生成操作)代替
8.Object.fromEntries()
Object.fromEntries()方式是Object.entries()的逆操作,用于将一个键值对数组转为对象。但只是用与 Map,和Object.entries()转换的数组,不能对原数组进行操作,所以是逆操作
Object.fromEntries([
['foo', 'bar'],
['baz', 42]
])
// { foo: "bar", baz: 42 }
9.WeakSet
WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别。
1.WeakSet的成员只能是对象
2.WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
10.WeakMap
WeakMap
与Map
的区别有两点
1.WeakMap
只接受对象作为键名(null
除外)
2.只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。