ES6基础特性快速掌握

这里仅列出你们容易忽略的知识点,用于查缺补漏~数组

Symbol

原始数据类型,由Symbol函数生成。数据结构

//正确.返回具备惟一性的值
Symbol()
Symbol(label)

//错误
//由于返回的是原始类型;同undefined;null;Boolean;String;Number;
//对象(Object、Array、Function)是引用数据类型。
new Symbol()

不能作字符串拼接等运算操做,但能够显示转换为字符串:Symbol().toString() //"Symbol()".
应用:
1.做为对象属性dom

//获取Symbol的方法:
Object.getOwnPropertySymbols(obj) //获取对象的Symbol属性名
Reflect.ownKeys(obj) //获取对象自身全部属性,包括不可枚举以及Symbol

能够在封装对象时,将Symbol用做非私有,但只用于内部访问的属性。(挂在对象上,但外部拿不到Symbol值就没法访问其对应的值)。
2.做为常量值
3.Symbol.for(label)
全局登记的方式,只有未找到的状况下才会返回新的Symbol值;利用其全局环境搜索的这个特性,能够跨iframe获取值。
4.内置Symbol值
执行对象(Object或String等)原型上特定的内部方法时,会自动执行对象对应的Symbol对应的函数。
举两个典型的例子:函数

1. Symbol.iterator
- 其值为对象的遍历器对象生成器
- 当使用for...of()循环时,会自动调用对象的Symbol.iterator方法
//for...of ES6提供的统一的访问数据结构的接口

2. Symbol.toStringTag   
//使用Object.prototype.toString方法,会先找对象的Symbol.toStringTag
({[Symbol.toStringTag]: 'M2'}).toString();  //"[object M2]"

Proxy | Reflect

ES6 为操做【对象】而提供的新 API。
Reflectthis

  • 内部方法:Proxy this问题 Reflect解决
  • 对象操做,部分命令式操做变成函数行为,如:delete obj.attr变为Reflect.deleteProperty(obj, attr)
  • 和Proxy方法一一对应

Set | Map

特性:
set:保证值的惟一性;去重。
map: 相对于对象,是一种更完善的hash结构实现。spa

适用使用for...of实现遍历的各类场景,如扩展运算符等。
Map 结构的默认遍历器接口(Symbol.iterator属性),就是entries方法。prototype

map[Symbol.iterator] === map.entries

Set 结构的实例默承认遍历,它的默认遍历器生成函数就是它的values方法。code

Set.prototype[Symbol.iterator] === Set.prototype.values

WeakSet | WeakMap对象

  • 只接受对象做为键名;
  • 弱引用,不计入垃圾回收;防止内存泄漏,但也致使不支持遍历和size。

用途:1)dom元素的记录or操做 2)私有方法 | 私有属性继承

Object

1.比较两个值是否彻底相同
//除了+0和-0不等;NaN等于自身。别的等同于===
Object.is(a,b) 

2.对象的合并;之拷贝对象自身可枚举的属性
//原始类型会被转换成对象
Object.assign(2)  //Number{2}
//原始类型只有字符串能够被拷贝到对象上,由于其可遍历(结合iterator理解)
Object.assign({}, 2, '3');  //{0: "3"}
//数组的替换
Object.assign([1,2,3], [4,5]) //[4,5,3]

3.设置|获取对象原型
Object.setPrototypeOf(target, prototype);
Object.getPrototypeOf(target);

4.遍历
Object.keys()
Object.values()
Obeject.entries() //对象转键值对数组

5.键值对数组转对象
Object.fromEntries() //entries的逆操做;所以适合将Map结构转为Object
Object.getOwnPropertyDescriptors()

返回指定对象全部自身属性(非继承属性)的描述对象。

主要是为了解决Object.assign()没法正确拷贝get属性和set属性的问题。getOwnPropertyDescriptors不只会返回对象属性,并且包括其属性描述器。
obj={a:'a',b:'b'}
Object.getOwnPropertyDescriptors(obj);
//output:
{
    a:{value:"a",writable:true,enumerable:true,configurable:true}
    b:{value:"b",writable:true,enumerable:true,configurable:true}
}

应用:能够结合Object.assignObject.create

Object.create(proto[, propertiesObject])

做用:建立一个新对象,使用已有对象做为新建立对象的__proto__;
propertiesObject可选,默认为建立对象的自有属性;

o = Object.create({a:1}, {
    foo: { 
        value: "hello" 
  }
})
o.hasOwnProperty('foo') //true

省略了的属性特性默认为false,因此属性foo是不可写(writable)、不可枚举(enumerable)、不可配置(configurable)。
常见示例:

  • 建立空对象
1. obj = {};
  等价于
  obj = Object.create(Object.prototype);

2. obj = Object.create(null); //建立一个原型为null的空对象
  • 子类继承父类时使用
// 子类续承父类
Rectangle.prototype = Object.create(Shape.prototype);
/*
* 等价于
* function prototypeCerate(o) {
*   function F() {}
*   F.prototype = o;
*   return new F();
* }
* Rectangle.prototype = prototypeCerate(Shape.prototype);

*/

Rectangle.prototype.constructor = Rectangle;

super

指向当前对象的原型对象;【做为构造函数 | 原型对象】

//指向原型对象时,只能用在对象方法中,以下:
const obj = {
  getName() { super.getName(); }
}
//错误. super被用在普通函数里面,该函数被赋值给getName。
const obj = {
  getName: () => super.getName()
}

内部原理:

super.foo
//1.做为原型属性:
Object.getPrototypeOf(this).foo
//2.做为原型方法:
`bject.getPrototypeOf(this).foo.call(this)

扩展运算符

//数组转对象。深入理解iterator遍历
 let a = { ...['a', 'b', 'c'] }; // {0: "a", 1: "b", 2: "c"}

更多技术分享,欢迎【扫码关注】~
1584413667(1).jpg

相关文章
相关标签/搜索