这里仅列出你们容易忽略的知识点,用于查缺补漏~数组
原始数据类型,由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]"
ES6 为操做【对象】
而提供的新 API。
Reflectthis
delete obj.attr
变为Reflect.deleteProperty(obj, attr)
特性:
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对象
用途:1)dom元素的记录or操做 2)私有方法 | 私有属性继承
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.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.assign
、Object.create
做用:建立一个新对象,使用已有对象做为新建立对象的__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;
指向当前对象的原型对象;【做为构造函数 | 原型对象】
//指向原型对象时,只能用在对象方法中,以下: 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"}
更多技术分享,欢迎【扫码关注】~