博客列表 >值|引用传递-数组|对象解构-call|apply|bind-访问器-流程控制

值|引用传递-数组|对象解构-call|apply|bind-访问器-流程控制

葡萄枝子
葡萄枝子原创
2021年12月07日 21:10:43731浏览

值|引用传递-数组|对象解构-call|apply|bind-访问器-流程控制

  1. 实例演示值传递与引用传递的区别与联系;
  2. 数组和对象解构的常用方法与函数传参
  3. call,apply,bind的区别与联系,并试着实例演示一下
  4. 访问器属性的原理与实现过程,并实例演示;
  5. 多分支与switch转换的技巧
  6. 三元运算解决了什么问题,有什么限制?

1. 实例演示值传递与引用传递的区别与联系

  • 值传递:原始类型 string, number, bool 等
  • 引用传递:引用类型 object, array 等
  • 深拷贝是值传递,浅拷贝是引用传递,传参是值传递
  1. // 值传递
  2. let a = 1;
  3. let b = a;
  4. // a = 1, b = 1
  5. console.log('a = %d, b = %d', a, b);
  6. a = 2;
  7. // 更新 a ,不影响 b 返回 a = 2, b = 1
  8. console.log('a = %d, b = %d', a, b);
  9. // 引用传递
  10. a = {x: 1, y: 2};
  11. b = a;
  12. // {x: 1, y: 2} {x: 1, y: 2}
  13. console.log(a, b);
  14. a.x = 2;
  15. // 更新对象 a ,对象 b 也更新
  16. // {x: 2, y: 2} {x: 2, y: 2}
  17. console.log(a, b);

值传递与引用传递

2. 数组和对象解构的常用方法与函数传参

  1. // 数组解构
  2. let [x, y, z = 3] = [1, 2];
  3. // 解构到 x, y, z 变量中
  4. // x = 1, y = 2, z = 3
  5. console.log('x = %d, y = %d, z = %d', x, y, z);
  6. // 对象解构
  7. let {x1, y1, z1 = 'three'} = {x1: 'one', y1: 'two'};
  8. // 解构到 x1, y1, z1 中
  9. // x1 = one, y1 = two, z1 = three
  10. console.log('x1 = %s, y1 = %s, z1 = %s', x1, y1, z1);
  11. // 函数传参
  12. // 数组传参
  13. let linkArr = ([a, b, c]) => `${a} | ${b} | ${c}`;
  14. // 1 | 2 | 3
  15. console.log(linkArr([x, y, z]));
  16. // 对象传参
  17. let linkObj = ({x1, y1, z1}) => `${x1} | ${y1} | ${z1}`;
  18. // one | two | three
  19. console.log(linkObj({x1, y1, z1}));

数组和对象解构

3. call,apply,bind的区别与联系,并试着实例演示一下

  • bind 绑定,返回一个函数声明,不会立即执行
  • call 和 apply 立即执行
  1. let test = function ( arg ) {
  2. return arg;
  3. };
  4. const testObj = {
  5. arg: 'args',
  6. };
  7. // 返回 Hi!
  8. console.log(test('Hi!'));
  9. // bind 返回一个函数声明,不会立即执行
  10. let f1 = test.bind(testObj, 'bind');
  11. // 返回 bind
  12. console.log(f1());
  13. // call | apply立即执行
  14. let f2 = test.call(testObj, 'call');
  15. // 返回 call
  16. console.log(f2);
  17. // 返回 apply
  18. let f3 = test.call(testObj, 'apply');
  19. console.log(f3);

bind-call-apply

4. 访问器属性的原理与实现过程,并实例演示

访问器:将方法伪造成一个属性,访问器属性优先级高于同名的普通属性

  1. const result = {
  2. data: {
  3. id: 1,
  4. meta: 'desc',
  5. },
  6. // 访问器,方法伪造成一个属性,取值
  7. get getId() {
  8. return this.data.id;
  9. },
  10. get getMeta() {
  11. return this.data.meta;
  12. },
  13. // 访问器,方法伪造成一个属性,赋值
  14. set setID(num) {
  15. this.data.id = num;
  16. },
  17. set setMeta(value) {
  18. this.data.meta = value;
  19. },
  20. }
  21. // 访问器,伪造的属性赋值
  22. result.setID = 2;
  23. result.setMeta = 'test';
  24. // 访问器,伪造的属性取值
  25. // getID = 2, getMeta = test
  26. console.log('getID = %s, getMeta = %s', result.getId, result.getMeta);

访问器属性

5. 多分支与switch转换的技巧

  1. // If 多分支
  2. let score = num => {
  3. if (num >= 0 && num < 60) return '不及格';
  4. else if (num >= 60 && num < 80) return '合格';
  5. else if (num >=80 && num <= 100) return '优秀';
  6. else if (num < 0 || num > 100) return '非法';
  7. }
  8. // 返回:非法 不及格 合格 优秀 非法
  9. console.log(score(-1), score(50), score(60), score(100), score(101));
  10. // switch来简化多分支
  11. score = num => {
  12. switch(true) {
  13. case num >= 0 && num < 60:
  14. return '不及格';
  15. // return 无需 break;
  16. case num >= 60 && num < 80:
  17. return '合格';
  18. case num >=80 && num <= 100:
  19. return '优秀';
  20. default:
  21. return '非法'
  22. }
  23. }
  24. // 返回:非法 不及格 合格 优秀 非法
  25. console.log(score(-1), score(50), score(60), score(100), score(101));
  26. // If 单值判断
  27. let response = status => {
  28. if (status.toLowerCase() === 'fail') {
  29. return '请求失败!';
  30. } else if (status.toLowerCase() === 'success') {
  31. return '请求成功!';
  32. } else {
  33. return '非法请求!';
  34. }
  35. }
  36. // 返回 请求成功!
  37. console.log(response('SUCCESS'));
  38. // switch 单值判断
  39. response = status => {
  40. switch(status.toLowerCase()) {
  41. case 'fail': return '请求失败!';
  42. case 'success': return '请求成功!';
  43. default: return '非法请求!';
  44. }
  45. }
  46. // 返回 请求成功!
  47. console.log(response('SUCCESS'));

多分支与switch转换

6. 三元运算解决了什么问题,有什么限制?

  • 三元运算解决了双分支的简化,也可以多分支,但不适合于没有返回值的判断。
  1. let status = 'SUCCESS';
  2. let res = status.toLowerCase() === 'fail' ? '请求失败!' : (status.toLowerCase() === 'success' ? '请求成功!' : '非法请求!');
  3. // 返回 请求成功!
  4. console.log(res);

三元运算

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议