博客列表 >模板字面量/访问器属性/流程控制

模板字面量/访问器属性/流程控制

心
原创
2021年01月08日 01:23:15785浏览

值传递与引用传递

  • 值传递
    -赋值
    -值:原始类型,string,number,bool
  • 引用传递
    -引用类型,object,array
  • 传参
    -传参时,不论什么类型,都是“值传递”
    -入参:调用函数是传入的参数
    -函数中对参数的更新,并不会影响到入参
    -对与引用类型,只有全新赋值才算是更新,修改属性不算的
    -赋值一个全新的对象,才是更新
    -函数中对于对象参数/引用参数的更新并没有影响到入参
  • 深拷贝:值拷贝
  • 浅拷贝:引用传递
  1. <script>
  2. //-值:原始类型,string,number,bool
  3. let a= 1;
  4. let b =a;
  5. console.log("a = %d,b = %d",a ,b);
  6. a = 2;
  7. //更新a,不影响b
  8. console.log("a = %d,b = %d",a, b);
  9. //引用类型,object,array
  10. let obj1 = {a:1,b:2};
  11. console.log(obj1);
  12. let obj2 = obj1;
  13. console.log(obj2);//值不变
  14. //更新obj1
  15. obhj1.a = 10;
  16. console.log(obj1);
  17. // obj2同步更新
  18. console.log(obj2);
  19. //传参时,不论什么类型,都是“值传递”
  20. const f1 = x =>(x=10);
  21. let m = 5;
  22. console.log("m = %d" , m);
  23. f1(m);
  24. // 入参:调用函数是传入的参数
  25. console.log("m = %d" , m);
  26. const f2 = x => (x.a = 10);
  27. let o = {a:1,b:2};
  28. console.log(0);
  29. f2(o);
  30. //看上去函数中对于o.a的更新生效,实际上仍是值传递
  31. console.log(o);
  32. //对与引用类型,只有全新赋值才算是更新,修改属性不算的
  33. const obj = {x1y:2};
  34. obj.x = 20;
  35. //赋值一个全新的对象,才是更新
  36. obj = {};
  37. const f3 = x =>(x={});
  38. f3(o);
  39. console.log(o);
  40. </script>

模板字面量/标签函数

  • 模板字面量:将表达式嵌入到字符串
    -模板字面里使用反引号:“ ` ”
    -模板字面量的组成
    -字符串字面里: “+,=”;
    -变量或表达式:a,b,(a+b)
    -模板字面量创建多行字符串可以保留格式
  1. <script>
  2. //模板字面量,把表达式嵌入到字符串
  3. let a = 1;
  4. let b =4;
  5. let res = a + “+” + B + "=" +(a+b);
  6. console.log(res);
  7. //使用反引号可以简写
  8. res = `${a}+${b} = ${a+b}`;
  9. console.log(res);
  10. //模板字面量创建多行字符串可以保留格式
  11. let menu = ['首页’,'视频','文章'];
  12. let hemlStr = `<ul>
  13. <li><a href="">${menu[0]}</a></li>
  14. <li><a href="">${menu[1]}</a></li>
  15. <li><a href="">${menu[2]}</a></li>
  16. </ul>`;
  17. console.log(htmlStr);
  18. document.body.inserAdjacentHTML("beforeEnd",htmlStr);
  19. </script>

标签函数:自定模板字面里的行为

  • 使用自定义函数来处理模板字面量,它的参数约定
    -第一个参数:模板字面里中的字符串字面量组成的数据
    -从第二个参数开始,将模板字面量中的变量一次传入
    -rest 简化
  1. <script>
  2. let hello = name=> alert(name);
  3. hello`你好`;
  4. //使用自定义函数来处理模板字面量,它的参数约定
  5. //第一个参数:模板字面里中的字符串字面量组成的数据
  6. //从第二个参数开始,将模板字面量中的变量一次传入
  7. let sum = (strs,a,b)=>{
  8. console.log(strs;)
  9. console.log(a,b);
  10. };
  11. //调用用数组包起来
  12. sum(['+','=',''],a,b);
  13. sum`${a}+${b}=`;
  14. //rest 简化
  15. sum(strs,...args)=>{
  16. console.log(strs)
  17. console.log(args);
  18. };
  19. sum`${a}+${b}=`;
  20. </script>

解构赋值

  • 解构赋值
    -快速从集合数据(数组/对象)解构出独立变量
    -参数解构
    -数组传参
  1. //数组
  2. <script>
  3. let [a,b,c] =[1,2,3];
  4. console.log(a,b,c);
  5. [a,b] = [1,2,3];
  6. console.log(a,b);
  7. [a,b,c,d="xxxx"] = [1,2,3];
  8. console.log(a,b,c,d);
  9. [a,b,...c] = [1,2,3,4,5];
  10. console.log(a,b,c);
  11. [,,a,,] = [1,2,3,4,5];
  12. console.log(a);
  13. let x = 1, y= 2;
  14. console.log("x=%d,y = %d",x,y);
  15. t=x;
  16. x = y;
  17. y=t;
  18. console.log("x=%d,y=%d",x,y);
  19. [y,x] = [x,y];
  20. console.log("x=%d,y=%d",x,y);
  21. </script>
  • 对象解析
    -属性名与变量必须一一对应,顺序无所谓
  1. <script>
  2. let{id,name}={id:10,name"手机"};
  3. console.log(id,name);
  4. //属性名与变量必须一一对应,顺序无所谓
  5. ({name,id}={id:10,name"手机"});
  6. console.log(id,name);
  7. //别名
  8. let email;
  9. {role,email:userEmail}={role:"user,email:"120@qq.com"}
  10. console.log(userEmail);
  11. //参数解构:数组传参
  12. let sum = ([a,b]) => a+b;
  13. console.log(sum([10,20]));
  14. //对象传参
  15. let getUser = ({nameemail}) => [name,email];
  16. console.log(getUser({name:"lisi",email:'510@qq.com'}));
  17. </script>

对象自变量的简化

  • 对象自变量简化
    -当属性名与同一个作用域的变量名相同时,可以直接使用属性名来引用变量值
    -方法也能简化:删除冒号和function,关键字
  • 箭头函数:
  • 箭头函数中的this总是指向定义它时的作用域(静态作用域/词法作用域),而并非调用时
    -user 对象不能出创建作用域,this指向了user的作用域/作用域链
    -全局没有userName,userEmail,所以输出 undefiend
  1. <script>
  2. let user = {
  3. userName:"李四";
  4. userEmail:"2000@qq.com";
  5. getInfo:function(){
  6. retrun `${this.userName}(${this.userEmail})`;
  7. },
  8. };
  9. console.log(user,getInfo());
  10. let {userName,userEmail} = user;
  11. console.log(userName,userEmail);
  12. let user = {
  13. //当属性名与同一个作用域的变量名相同时,可以直接使用属性名来引用
  14. userName,
  15. userEmail,
  16. getInfo(){
  17. retrun `${this.userName}(${this.userEmail})`;
  18. },
  19. };
  20. //使用箭头函数
  21. user = {
  22. userName,
  23. userEmail,
  24. //使用箭头函数
  25. getInfo:()=>`${this.userName}(${this.userEmail})`;
  26. //当前函数中的this指向了全局window
  27. test:()=>console.log(this),
  28. }
  29. console.log('简化:',user,getInfo());
  30. console.log(user.test());
  31. </script>

bind,call,apply

  • bind 不会立即执行
    -动态改变this
  • call/apply 立即执行
  • apply 必须是数组
  1. <button>点击</button>
  2. <script>
  3. function hello(name){
  4. this.name = name;
  5. console.log(this.name);
  6. }
  7. const obj = {name:'admin',};
  8. //经典调用
  9. console.log(hellog("朱老师"));
  10. //bind()不会立即执行,只返回一个函数声明
  11. let f = hello.bind(obj,'你好');
  12. console.log(f());
  13. //call/apply立即执行
  14. f= hello.call (obj,'世界');
  15. console.log(f);
  16. f= hello.apply(obj,['世界']);
  17. console.log(f);
  18. //bind()应用案例
  19. document.querSelector('button').addEventListener('click',function(){
  20. console.log(this.name);
  21. console.log(this);
  22. document.body.appendChild(document.createElement('p').innerHTML = '欢迎:' + this.name);
  23. },bind({name:'猫科动物'}));
  24. </script>

访问器属性

  • 访问器属性
    -将方法伪造成一个属性
    -访问器属性优先级高于同名的普通属性
  1. <script>
  2. const product = {
  3. data:[
  4. {name:"电脑"price5000num:5},
  5. {name:"手机"price5000num:5},
  6. {name:"相机"price5000num:5},
  7. ],
  8. getAmounts(){
  9. return this.data.reduce((t,c)=>(t+=c.price*c.num),0);
  10. },
  11. //访问器属性
  12. get total(){
  13. return this.data.reduce((t,c)=>(t+=c.price*c.num),0);
  14. },
  15. set setPrice(price){
  16. this.data[1].price = price;
  17. }
  18. }
  19. console.log('总金额:',product.getAmounts());
  20. console.log(总金额:',product.total);
  21. product.setPrice=9988;
  22. console.log(product.data[1].price);
  23. </script>

流程控制-分支

  • 流程控制
    -if(){}else{}
    -switch(){case “条件” break;default}
  • 三元运算符
    -条件?true : false
  1. <script>
  2. let score = 64;
  3. //单分支
  4. if(score >= 60){
  5. console.log('及格');
  6. }
  7. //双分支
  8. if(score>=60){
  9. console.log('及格');
  10. } else {
  11. console.log('补考');
  12. }
  13. //多分枝
  14. if(score >= 60 && score <80){
  15. console.log('合格');
  16. }else if(score >= 80 && score <= 100){
  17. console.log('学霸');
  18. }
  19. //判断成绩是否合法
  20. else if (scoure > 100 || score < 0){
  21. console.log('非法数据');
  22. }
  23. else {
  24. console.log('补考');
  25. }
  26. switch(true){
  27. case score >= 60 && scoure < 80:
  28. console.log('合格');
  29. break;
  30. case score >= 80 && scoure < 100:
  31. console.log('学霸');
  32. break;
  33. case score >100 || scoure < 0:
  34. console.log('非法数据');
  35. break;
  36. default:
  37. console.log('补考');
  38. }
  39. //switch用在单值判断
  40. let respponse = 'Success';
  41. switch(respponse.toLowerCase()){
  42. case 'fail';
  43. console.log('请求失败');
  44. break;
  45. case 'success';
  46. console.log('请求成功');
  47. break;
  48. default:
  49. console.log('未知错误');
  50. }
  51. // 三元运算符
  52. console.log(score>=60 "及格" "补考");
  53. if(score>=10){
  54. console.log('及格');
  55. }else{
  56. console.log('补考');
  57. }
  58. </script>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议