箭头函数和this定律:this的指向在函数定义的时候是无法确定的,只有在函数执行的时候才能确定this指向谁。事实上,这最终指向了调用它的对象。ES6+箭头函数没有自己的this,处理机制是在自己的上下文中使用this。为什么这个?this是当前函数执行的主体(谁执行了函数)。常见this场景事件绑定:触发事件时,this一般是被操作的元素普通函数:函数执行时,检查函数前面是否有点号。如果有一个点,则执行主体在该点的前面。如果没有点,则为窗口。在严格模式下,它是undefined。匿名函数和回调函数中的this为window或undefined。构造函数:待定。..箭头函数:函数没有自己的this,处理机制是在自己的上下文中使用this。基于call/bind/apply,强行改成指向Proxy。constperson={name:"Lisi",sex:"Male",age:18,};varobj=newProxy(person,{get:function(target,propKey,receiver){returntarget[propKey];},设置:函数(目标、propKey、值、接收器){console.log(“值--->”,值);返回目标[propKey];},});obj.name=“jack”;console。log(obj.name);//output//value--->jack//对比definePropertyObject.defineProperty(object1,"property1",{value:42,writable:false,});object1.property1=77;//strictmodeconsole.log(object1.property1);//预期输出:42defineProperty只能监听属性的读写,Proxy可以监听删除,调用等,defineProperty需要重写上面的方法arraytohijack,Proxy可以直接以非侵入的方式监控被Proxy监管的对象的读写。Reflect统一提供了一套操作对象的API。constperson={name:"李四",sex:"男",age:18,};//console.log("name"inperson);//console.log(deleteperson["age"]);//console.log(Object.keys(person));Reflect.has(person,"name");Reflect.defineProperty(person,"age");Reflect.ownKeys(person);Reflect.apply(target,thisArg,args):等同于Function.prototype.apply.call(func,thisArg,args),用于绑定this对象后执行给定的函数Reflect.construct(target,args):同newtarget(...args),它提供了一种无需使用new即可调用构造函数的方法。Reflect.get(target,name,receiver):查找并返回目标对象的name属性,如果没有该属性则为undefined。Reflect.set(target,name,value,receiver):设置目标对象的name属性等于value。Reflect.defineProperty(target,name,desc):基本等同于Object.defineProperty,用于为对象定义属性Reflect.deleteProperty(target,name):等同于deleteobj[name],用于删除对象的属性。Reflect.has(target,name):对应obj中name中的in操作符。Reflect.ownKeys(target):用于返回对象的所有属性,基本相当于Object.getOwnPropertyNames和Object.getOwnPropertySymbols之和。Reflect.isExtensible(target):对应Object.isExtensible,返回一个布尔值,表示当前对象是否可扩展。Reflect.preventExtensions(target):对应Object.preventExtensions方法,用于使一个对象不可扩展。它返回一个布尔值,指示操作是否成功。Reflect.getOwnPropertyDescriptor(target,name):基本等同于Object.getOwnPropertyDescriptor,用于获取指定属性的描述对象Reflect.getPrototypeOf(target):用于读取对象的__proto__属性,对应于Object.getPrototypeOf(obj).Reflect.setPrototypeOf(target,prototype):用于设置目标对象的原型(prototype),对应Object.setPrototypeOf(obj,newProto)方法。它返回一个布尔值,指示设置是否成功。集合类似于数组,但其成员的值是唯一的,不存在重复值。consts=newSet();s.add(1).add(2).add(3).add(4);console.log(s);//循环for(itemofs){console.log(item);}//大小console.log(s.size);//判断是否有console.log(s.has(1));//删除console.log(s.delete(1));console.log(s);//清空集合s.clear();console.log(s);//数组转换constarr=[1,2,3,4,5,6,7];//constresult=Array.from(newSet(arr));constresult=[...newSet(arr)];console.log(result);映射键值对集合。与普通对象不同,键可以有任何值。常见对象的关键字符。letmap=newMap().set("name","jaco").set("sex","male").set("age",18);console.log(map);console.log(map.has("name"));//map.delete();//map.size;//map.clear();SymbolSymbol表示唯一值的新原始数据类型。它是JavaScript语言的第七种数据类型,前六种是:undefined、null、Boolean、String、Number、Object。console.log(Symbol("foo"));console.log(Symbol("bba"));constobj={};obj[Symbol("foo")]=123;obj[Symbol("bba")]=123;console.log(obj);//得到相同的符号consts1=Symbol.for("foo");consts2=Symbol.for("foo");console.log(s2===s1);自定义toString标签constobj={[Symbol.toStringTag]:"hahaha",[Symbol()]:"ttttt",};console.log(obj.toString());getsymbolattributenameObject.keys(obj),获取不到symbol类型的属性名。JSON.stringify(obj),符号类型在序列化时会被忽略。console.log(Object.getOwnPropertySymbols(obj));可迭代接口是为各种数据结构(数组、对象、集合、映射)提供统一访问机制的接口。任何数据结构只要部署了Iterator接口就可以完成遍历操作(即依次处理数据结构的所有成员)。varit=makeIterator(["a","b"]);it.next();//{value:"a",done:false}it.next();//{value:"b",done:false}it.next();//{value:undefined,done:true}functionmakeIterator(array){varnextIndex=0;return{next:function(){returnnextIndex
