回顾复习set 、map

time 5m
需要有清晰认知,foreach、reduce这些方法是干什么的,返回值是什么
需要总结

map转数组

time 8m11s
用展开运算符,map结构转成数组

  1. const myMap = new Map();
  2. myMap.set(true, 7)
  3. .set({foo: 3}, ['abc']);
  4. console.log(myMap);
  5. console.log([...myMap]);

image.png

数组转成map,map([])

image.png

map转成对象

time 15m44s
map 转成对象;(条件:键名为字符串)
键名为对象,对象的键名只能是字符串,不能是对象

  1. const map = new Map();
  2. map.set(true, 7)
  3. .set({foo: 3}, ['abc']);
  4. function mapToObj(strMap) {
  5. const obj = {};
  6. // for (let {0:key, 1:value} of strMap) {
  7. for (let [key, value] of strMap) {
  8. obj[key] = value;
  9. // console.log(key,value)
  10. }
  11. return obj;
  12. }
  13. const res = mapToObj(map);
  14. console.log(res);
  15. // console.log(map);

image.png

对象转换成map

time 21m04s
image.png

map对比array

time 26m41s
map比array简单
image.png
image.png

set对比array

time 41m48s
set比array略微简单
image.png

map、set、object对比

time 53m49s
image.png
image.png
image.png

weakMap、weakSet

time 1h3m

  1. console.log(new WeakMap());
  2. console.log(new WeakSet());

image.png

time 1h6m

  1. let wm=new WeakSet();
  2. // wm.add(1);//Uncaught TypeError: Invalid value used in weak set
  3. /*成员只能是对象,里面的内容只能是对象*/
  4. wm.add({})//正确 可以运行
  5. wm.add([])//正确 可以运行 数组也是对象
  6. console.log(wm);

image.png

time 1h7m

  1. let wm=new WeakMap();
  2. // wm.set('t',2)//Uncaught TypeError: Invalid value used as weak map key
  3. wm.set({t:1},2)//正确 可以运行 键名必须是一个对象,成员只能是对象
  4. console.log(wm);

这些都不是最主要区别,最主要区别是回收机制是不一样的,它是一个弱引用,垃圾回收不会考虑它们的引用。如果外界没有引用它们,直接被销毁,不考虑它的引用,直接释放
引用见闭包,被外界引用不销毁。

内存周期

time 1h9m

  1. var o1 = {
  2. o2: {
  3. x: 1
  4. }
  5. }
  6. var o3=o1;
  7. o1=1;
  8. var o4=o3.o2;
  9. o3='123';
  10. o4=null;

o4不设置为null,持有o3.o2的引用,不会被删除
var o4=weakmap;是个弱引用,不计数为1,还是0,计数为0,可能这个成员就直接就消失了,会被垃圾回收,导致结果不稳定,不知道什么时候就被垃圾回收了,所以它不适合引用
weakmap引用时,不会记录引用次数,不会引用次数+1
不能迭代,因为有可能消失,行为不可以预知

很少会用到

proxy

time 1h18m
设计模式:代理模式
proxy是一个构造函数,es6中通过这个实现代理模式,这是代理模式的一种实现方式

概念

代码示例get方法

time 1h27m

  1. let star = {
  2. name: 'li**',
  3. age: '25',
  4. phone: 'star 1388888888'
  5. }
  6. let agent = new Proxy(star, {
  7. get: function (target, key) {
  8. if (key === 'phone') {
  9. return 'agent:1383838438';
  10. // return target[key];
  11. }
  12. if(key==='price'){
  13. return 12000;
  14. }
  15. return target[key];
  16. }
  17. })
  18. console.log(agent.phone);//agent:1383838438
  19. console.log(agent.price);//12000
  20. console.log(agent.name);//li**
  21. console.log(agent.age);//25
  1. /*例子,比如我想找一个明星商演,明星很忙,我得找她的经纪人,经纪人代理沟通这件事
  2. * 我直接联系不到明星本身,只能和代理人沟通,联系*/
  3. let star = {
  4. name: 'li**',
  5. age: '25',
  6. phone: 'star 1388888888'
  7. }
  8. /*代理人,用proxy封装了明星*/
  9. let agent = new Proxy(star, {
  10. /*get方法,获取方法,覆盖,重载
  11. * 读取操作,拦截的是读取操作*/
  12. get: function (target, key) {
  13. /*判断key值*/
  14. if (key === 'phone') {
  15. /*代理人不想告诉我明星的电话,我只能查到代理人的电话,代理人只给我代理人的电话,
  16. * 联系方式*/
  17. return 'agent:1383838438';
  18. /*代理人告诉明星的电话*/
  19. // return target[key];
  20. }
  21. /*明星没有的属性,也能通过代理人得知*/
  22. if (key === 'price') {
  23. return 12000;
  24. }
  25. /*名字、年龄等公开的东西,代理人也可以直接告诉,直接从明星身上取得*/
  26. return target[key];
  27. }
  28. })
  29. console.log(agent.phone);//agent:1383838438
  30. console.log(agent.price);//12000
  31. console.log(agent.name);//li**
  32. console.log(agent.age);//25
  33. console.log(agent);

image.png

set方法

time 1h38m

  1. /*例子,比如我想找一个明星商演,明星很忙,我得找她的经纪人,经纪人代理沟通这件事
  2. * 我直接联系不到明星本身,只能和代理人沟通,联系*/
  3. let star = {
  4. name: 'li**',
  5. age: '25',
  6. phone: 'star 1388888888'
  7. }
  8. /*代理人,用proxy封装了明星*/
  9. let agent = new Proxy(star, {
  10. /*get方法,获取方法,覆盖,重载
  11. * 读取操作,拦截的是读取操作*/
  12. get: function (target, key) {
  13. /*判断key值*/
  14. if (key === 'phone') {
  15. /*代理人不想告诉我明星的电话,我只能查到代理人的电话,代理人只给我代理人的电话,
  16. * 联系方式*/
  17. return 'agent:1383838438';
  18. /*代理人告诉明星的电话*/
  19. // return target[key];
  20. }
  21. /*明星没有的属性,也能通过代理人得知*/
  22. if (key === 'price') {
  23. return 12000;
  24. }
  25. /*名字、年龄等公开的东西,代理人也可以直接告诉,直接从明星身上取得*/
  26. return target[key];
  27. },
  28. /*赋值操作*/
  29. set:function (target,key,value) {
  30. if(value<100000){
  31. throw new Error('价格太低');
  32. }else {
  33. target[key]=value;
  34. return true;
  35. }
  36. }
  37. })
  38. console.log(agent.phone);//agent:1383838438
  39. console.log(agent.price);//12000
  40. console.log(agent.name);//li**
  41. console.log(agent.age);//25
  42. // console.log(agent);
  43. agent.customPrice=150000;
  44. console.log(agent.customPrice);//150000
  45. /*agent、star都有customPrice的值*/
  46. console.log(agent);
  47. console.log(star);

image.png

has操作

time 1h44m

  1. /*例子,比如我想找一个明星商演,明星很忙,我得找她的经纪人,经纪人代理沟通这件事
  2. * 我直接联系不到明星本身,只能和代理人沟通,联系*/
  3. let star = {
  4. name: 'li**',
  5. age: '25',
  6. phone: 'star 1388888888'
  7. }
  8. /*代理人,用proxy封装了明星*/
  9. let agent = new Proxy(star, {
  10. /*get方法,获取方法,覆盖,重载
  11. * 读取操作,拦截的是读取操作*/
  12. get: function (target, key) {
  13. /*判断key值*/
  14. if (key === 'phone') {
  15. /*代理人不想告诉我明星的电话,我只能查到代理人的电话,代理人只给我代理人的电话,
  16. * 联系方式*/
  17. return 'agent:1383838438';
  18. /*代理人告诉明星的电话*/
  19. // return target[key];
  20. }
  21. /*明星没有的属性,也能通过代理人得知*/
  22. if (key === 'price') {
  23. return 12000;
  24. }
  25. /*名字、年龄等公开的东西,代理人也可以直接告诉,直接从明星身上取得*/
  26. return target[key];
  27. },
  28. /*赋值操作*/
  29. set: function (target, key, value) {
  30. if (value < 100000) {
  31. throw new Error('价格太低');
  32. } else {
  33. target[key] = value;
  34. return true;
  35. }
  36. },
  37. /*监听了一个in操作符*/
  38. has: function (target, key) {
  39. console.log('请联系agent:1383838438');
  40. if (key === 'customPrice') {
  41. return target[key];
  42. } else {
  43. return false;
  44. }
  45. }
  46. })
  47. console.log(agent.phone);//agent:1383838438
  48. console.log(agent.price);//12000
  49. console.log(agent.name);//li**
  50. console.log(agent.age);//25
  51. // console.log(agent);
  52. agent.customPrice = 150000;
  53. console.log(agent.customPrice);//150000
  54. /*agent、star都有customPrice的值*/
  55. /* console.log(agent);
  56. console.log(star);*/
  57. console.log('customPrice' in agent);//true boolean
  58. console.log('price' in agent);//false
  59. /*不打印请联系agent:1383838438,说明has没有运行
  60. * for in时has不运行
  61. * has 没办法拦截 for in*/
  62. for (let key in agent) {
  63. console.log(agent[key]);
  64. }

reflect

time 1h54m

  1. console.log(Reflect);

image.png
一般用不到

  1. /*例子,比如我想找一个明星商演,明星很忙,我得找她的经纪人,经纪人代理沟通这件事
  2. * 我直接联系不到明星本身,只能和代理人沟通,联系*/
  3. let star = {
  4. name: 'li**',
  5. age: '25',
  6. phone: 'star 1388888888'
  7. }
  8. /*代理人,用proxy封装了明星*/
  9. let agent = new Proxy(star, {
  10. /*get方法,获取方法,覆盖,重载
  11. * 读取操作,拦截的是读取操作*/
  12. get: function (target, key) {
  13. /*判断key值*/
  14. if (key === 'phone') {
  15. /*代理人不想告诉我明星的电话,我只能查到代理人的电话,代理人只给我代理人的电话,
  16. * 联系方式*/
  17. return 'agent:1383838438';
  18. /*代理人告诉明星的电话*/
  19. // return target[key];
  20. }
  21. /*明星没有的属性,也能通过代理人得知*/
  22. if (key === 'price') {
  23. return 12000;
  24. }
  25. /*名字、年龄等公开的东西,代理人也可以直接告诉,直接从明星身上取得*/
  26. return target[key];
  27. },
  28. /*赋值操作*/
  29. set: function (target, key, value) {
  30. if (value < 100000) {
  31. throw new Error('价格太低');
  32. } else {
  33. target[key] = value;
  34. return true;
  35. }
  36. },
  37. /*监听了一个in操作符*/
  38. has: function (target, key) {
  39. console.log('请联系agent:1383838438');
  40. if (key === 'customPrice') {
  41. return target[key];
  42. } else {
  43. return false;
  44. }
  45. },
  46. /*拦截delete操作*/
  47. deleteProperty:function (target, key) {
  48. if(key.indexOf("_")===0){
  49. delete target[key];
  50. }
  51. },
  52. /* ownKeys:function (target) {
  53. console.log(1);
  54. console.log(target);
  55. }*/
  56. })
  57. console.log(agent.phone);//agent:1383838438
  58. console.log(agent.price);//12000
  59. console.log(agent.name);//li**
  60. console.log(agent.age);//25
  61. // console.log(agent);
  62. agent.customPrice = 150000;
  63. console.log(agent.customPrice);//150000
  64. /*agent、star都有customPrice的值*/
  65. /* console.log(agent);
  66. console.log(star);*/
  67. console.log('customPrice' in agent);//true boolean
  68. console.log('price' in agent);//false
  69. /*不打印请联系agent:1383838438,说明has没有运行
  70. * for in时has不运行
  71. * has 没办法拦截 for in*/
  72. for (let key in agent) {
  73. console.log(agent[key]);
  74. }

一般只用get、set、has、deleteProperty这几个操作

使用

time 1h58m

  1. var obj = {
  2. a: 1,
  3. b: 2,
  4. c: 3
  5. }
  6. // console.log(Reflect);
  7. console.log(Reflect.get(obj,'a'));//1

Reflect映射响应的一系列方法,Reflect其实就是一种简便的写法,以前通过操作符来定义,现在通过函数来定义,语义化更好

image.png

es5

  1. Object.defineProperty

通过简便的方式,比上面用Object简单,减少歧义,认为这样更加合理,了解就行
es6

  1. Reflect.defineProperty

time 2h8m
image.png
本质上把Object上的方法移动到了Reflect上,并且做了异常处理
原本是Object操作符,现在Reflect把它变成了函数行为