复习-ES6(2)

28 阅读4分钟

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推出了 ?. 运算符 直接在链式调用的时候判断,左侧的对象是否为nullundefined。如果是的,就不再往下运算,而是返回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

WeakMapMap的区别有两点

1.WeakMap只接受对象作为键名(null除外)

2.只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。