一,Symbol 类型:基本数据类型 目的:解决对象的属性名冲突。 注意点: (1),symbol永远都是独一无二的值,即使相同参数,描述相同,两个symbol也是不相等的 (2),symbol类型的值作为对象的属性名的时候,一定要用中括号[ ],不能用点运算符 (3),for...in,for...of,keys( )以上几种方法都无法获取到symbol类型的属性。 symbol的方法 (1),Object.getOwnPropertySymbols() 找到symbol类型的属性并且返回一个数组(注意:用该方法前必须定义symbol类型) let name =Symbol() let age =Symbol() let person ={ [age]:"张三", [name]:12, }; var n=Object.getOwnPropertySymbols(person); console.log(n)//[Symbol(), Symbol()] (2),Reflect.ownKeys 一次性获取所有类型的属性,不管它是字符串类型还是symbol类型 let name =Symbol() let age =Symbol() let person ={ [age]:"张三", [name]:12, sex:"男" }; console.log(Reflect.ownKeys(person))//Array(3)0:"sex"1:Symbol()2:Symbol() (3),Symbol.for 根据参数名,去全局环境中搜索是否有以该symbol.for()参数为名的symbol值,有就返回它,没有就以该参数名来创建一个新的symbol值。所以如果用symbol.for()写两次相同的描述的时候,只是把同一个地址的symbol给了 两个变量而已,所以这两个变量全等 let name =Symbol.for() let age =Symbol.for() console.log(name===age)//true (4),Symbol.keyFor 和symbol.for()用法相同 二,代理(proxy) 代理的步骤 1,首先需要先有一个目标对象,让它被代理 // 创建个人账户包含RMB和dollar var personCount = { RMB:10,dollar:0}; 2,创建代理实例 传入两个参数,第一个参数是被代理的对象,第二个参数是代理的距离实现对象 // 创建一个代理实例 var banker = new Proxy(personCount,{ get:function(target,property){ if(target[property]>0){ return target[property] }else{ return '余额不足' } }, set:function(target,property,value){ // console.log(value) if(Number.isInteger(value)){ console.log('请设置正确得数字') } target[property] = value; } }) 3,取消代理 let object = Proxy.revocable(personCount,banker) console.log(object) //{proxy: Proxy, revoke: ƒ} object.revoke();// 真正取消代理操作 ...未完待续 三,新增遍历的使用 (1),for...of for...of可遍历的对象包括数组,对象,字符串,set和map结构等具有iterator 接口的数据结构。 (2),for...of和for...in的区别 for...of可以设置终止,通过if判断和break,continute的结合使用,for...in必须遍历完才会终止 for...of 获取的索引或者其他内容,可以是数字类型,而for...in 一定是字符串类型 for...of不可以遍历对象的属性,for...in可以遍历对象的属性 原因:能够被for...of正常遍历的,都需要实现一个遍历器Iterator。而数组,Set和Map结构,早就内置好了遍历器Iterator(又叫迭代器),它们的原型中都有一个Symbol.iterator方法;而Object对象并没有实现这个接口,使得它无法被for...of遍历