博客列表 >实例演示流程的分支循环和函数参数的返回值,并对对象字面量和模板字面量进行了演示,分析了模板字面量和模板函数的参数功能

实例演示流程的分支循环和函数参数的返回值,并对对象字面量和模板字面量进行了演示,分析了模板字面量和模板函数的参数功能

卢先生
卢先生原创
2022年01月02日 01:16:16486浏览

以防以后代码不会,今日代码学习部分又很长,将自己写的整体代码部分,放到文章的最后.

流程控制

流程控制分支

  1. 默认分支
  2. 顺序分支,顺序分支又分为单分支, 双分支,多分支
  3. 循环分支
默认分支

代码示例:

  1. {
  2. console.log("我爱你");
  3. }
  4. // 分支的意思就是有条件的时候,执行
  5. // 单分支,就是执行的时候判断一次,只有一个分支结果
  6. // 声明一个变量
  7. let love = 10;
  8. if (love >= 10) {
  9. console.log("我爱你十分");
  10. }

运行示例图:

双分支

语法:

  1. if(条件){
  2. 成立结果
  3. }else{
  4. 不成立结果
  5. }
  6. //简化方案语法
  7. let ai = love <= 15 ? "成立" : "不成立";
  8. //前面我用let 声明了一个ai变量,把结果储存里面了

代码示例:

  1. // 双分支
  2. // 有一个默认分支,除了判断的那个分支外,当找不到当前匹配的结果时,默认的那个分支
  3. love = 16;
  4. if (love <= 15) {
  5. console.log("你对我的爱还没有十五分");
  6. } else {
  7. console.log("还是你比较爱我,都超过15分了");
  8. }
  9. // 双分支的简化
  10. // 需要用一个变量声明来做,下面是简化方案:
  11. let ai = love <= 15 ? "你对我的爱还没有十五分" : "还是你厉害,爱死我了,对我的爱都超过15分了";
  12. console.log(ai);
  13. // 语法请记住,双支判断的时候,是 判断语法 ? true : false;

示例截图:

多分支:

示例代码:
语法:

  1. if (条件) {
  2. 结果
  3. } else if (条件) {
  4. 结果
  5. } else if (条件) {
  6. 结果
  7. }
  8. //简写switch版本
  9. switch (传入的值或表达式进入) {
  10. case 条件判断:
  11. //需要输出的值
  12. break;
  13. case 条件判断:
  14. //需要输出的值
  15. break;
  16. default:
  17. //默认值
  18. break;
  19. }
  1. // 多分支
  2. love = 55;
  3. if (love <= 10) {
  4. console.log("我还没超过十岁拉");
  5. } else if (love > 10 && love <= 20) {
  6. console.log("我在10到20岁之间");
  7. } else if (love >= 21 && love <= 35) {
  8. console.log("我还是青春期吗???");
  9. } else if (love >= 36 && love <= 50) {
  10. console.log("我现在是青壮年??");
  11. } else if (love >= 51 && love <= 60) {
  12. console.log("我这年级上不了班了,在家待业吧,要不就看个大门吧");
  13. } else if (love >= 60) {
  14. console.log("超过60啦,在家哄小孩啦");
  15. }
  16. // 多分支优化简写版本
  17. love = 50;
  18. switch (true) {
  19. case love > 10 && love <= 20:
  20. console.log("我在十岁到20岁之间");
  21. break;
  22. case love >= 21 && love <= 35:
  23. console.log("我还是青春期吗???");
  24. default:
  25. console.log("你猜猜我几岁");
  26. }
  27. // love = 10;
  28. // switch (true) {
  29. // case love > 10 && love <= 20:
  30. // console.log ("我还没超过十岁拉");
  31. // break;
  32. // default:
  33. // console.log("我在10到20岁之间");
  34. // }

代码示例截图:

单值判断变量

单值条件判断,其实我还是用的是多分支,只不过用swith传入了一个值
使用了一个方法
.toLocaleLowerCase() //对字母大小写进行格式化

  1. let zhan = "dedecms";
  2. // 还可以对字符格式化处理,比如别人提供的api是大小写字母等操作,我们需要对大小写进行格式化
  3. zhan = "Diguocms";
  4. zhan = "Zblog";
  5. // switch语法是,
  6. // seitch(判断,可以是外部变量的判断) {
  7. // case 结果(这个结果可能是一个字符也可能是数字,甚至可能是一个表达式 break)}
  8. switch (zhan.toLocaleLowerCase()) {
  9. case "dedecms":
  10. console.log("目前使用的织梦cms");
  11. break;
  12. case "diguocms":
  13. console.log("目前使用的帝国cms");
  14. break;
  15. case "zblog":
  16. console.log("目前使用zblog博客程序");
  17. break;
  18. default:
  19. console.log("可能大佬用的discuz吧");
  20. break;
  21. }

示例截图:

流程控制: 循环

先进行获取数组的长度
使用代码:.length获取数组的长度
代码示例:

  1. // 先声明一个数组类常量
  2. const niuniu = ["niu", "luotuo", "feiji"];
  3. // 打印一下
  4. console.log(niuniu[0], niuniu[1], niuniu[2]);
  5. // 当前的索引是从0开始,0 , 1, 2
  6. // array是一个数组, 数组就是对象, 既然是对象就有方法和属性;
  7. console.log(niuniu.length);
  8. // .length 打印当前数组的长度.数组名.length
  9. // 当前属性是打印数组的长度,当前数组有三个对象,;
  10. console.log(niuniu[2]);
  11. console.log(niuniu[3]);
  12. // 提示越界了,没有这个参数
  13. console.log(niuniu.length - 1);
  14. console.log(niuniu[niuniu.length - 1]);
  15. console.log(niuniu[niuniu.length]);
  16. // 因为数组的长度是3,但是数组是从0开始的,结束就为2,所以超出越界了,因为数组的索引是从0开始

示例截图:

遍历索引

遍历索引的条件:
遍历循环数据的三个条件

  1. 起始索引
  2. 循环条件
  3. 更新条件

代码示例:

  1. // 先声明一个当前索引
  2. let a = 0;
  3. let b = niuniu.length;
  4. // 遍历循环数据的三个条件, 1,起始索引, 2,更新, 3,结束
  5. if (a < b) {
  6. console.log(niuniu[a]);
  7. a = a + 1;
  8. }
  9. if (a < b) {
  10. console.log(niuniu[a]);
  11. a = a + 1;
  12. }
  13. if (a < b) {
  14. console.log(niuniu[a]);
  15. a = a + 1;
  16. // 或者a++,意思一样
  17. }
  18. ////////////////////
  19. /////下面是简化方案
  20. ///////////////////
  21. //这里以后回来看不要看不懂哦,这里是已经使用.length获取了数组的长度,let b = niuniu.length;赋值给了参数b,在上面,所以条件是当a=0,当a小于b时,a++,
  22. a = 0;
  23. while (a < b) {
  24. console.log(niuniu[a]);
  25. a++;
  26. }
  27. /**
  28. * * 循环三条件
  29. * * 1. 初始条件: 数组索引的引用 ( i = 0 )
  30. * * 2. 循环条件: 为真才执行循环体 ( i < arr.length )
  31. * * 3. 更新条件: 必须要有,否则进入死循环 ( i++ )
  32. */

示例截图:

简体方案一在上面已经写了第一个,下面是第二种简体方案
是用do while,
while是先判断条件是否成立,然后再进入循环体执行,do while是无论是否条件成立,都将循环一次.
示例代码:

  1. // //while()入口型判断
  2. // * do {} while(), 出口型判断,无论条件是否成立, 必须执行一次代码块
  3. a = 0;
  4. do {
  5. console.log(niuniu[a]);
  6. a++;
  7. } while (a < niuniu.length);
  8. // do循环是先执行一遍,然后才是判断语句

示例截图:

既然是循环体,那么还可以继续优化,继续优化的方案就是,先计算数组的长度,计算完毕后赋值给一个参数,老师还说了其他两种方案,哪两种方案最后说
先看未使用迭代,直接使用for循环的方式
代码部分:

  1. // ! for () 是 while 的简化
  2. // * 语法: for (初始条件; 循环条件; 更新条件) {...}
  3. for (a = 0; a < niuniu.length; a++) {
  4. console.log(niuniu[a]);
  5. }

示例截图:

使用先计算数组长度,再进行循环的
就是预先将数组的长度,计算出来,放入到一个变量中,不必要每次循环都将计算数组的长度
代码部分:

  1. // 优化方案
  2. // 这个理解为,初始条件为a等于0,b是数组长度,当a小于数组长度时,a自身+1
  3. // 优化, 将数组长度,提前计算出来缓存到一个变量中
  4. for (a = 0, b = niuniu.length; a < b; a++) {
  5. console.log(niuniu[a]);
  6. }

剩下的是两种迭代器的for of 和for in方案,在es6中很常见的方案
for of:对数组操作循环
for in:对对象操作循环,当然,数组也是对象,也可以使用,但是不建议使用
首先说for of要知道几个方法,我用表格写到下面:

方法 使用方式/示例 说明
.entries() 数组.keys()/niuniu.keys() .entries() 数组成员, 输出数组中的 “键值” 对组成的数组
.keys() 数组.entries/niuniu.entries .keys()输出数组中的 “键” 对组成的数组
.values() 数组.values/niuniu.values 输出数组中的 “值” 对组成的数组默认调用values(),输出值

for of代码语法:

  1. for (let 变量 of 数组.entries()) {
  2. console.log(变量);
  3. }

代码示例:

  1. // ! for - of : 快速迭代处理集合数据
  2. // * 数组内部有一个迭代器的方法, 可以用for-of
  3. // * for-of优点: 用户不必再去关心索引, 而将注意力集中到数组成员上
  4. // 感觉for - of 是魔改版本,因为他缺少了起始和更新条件,只有一个数组成员,而数组成员直接赋值给了变量,变成了数组
  5. // 写法是:
  6. // 使用到一个新的对象方法,
  7. // .entries() 数组成员
  8. // v 输出数组中的 "键值" 对组成的数组
  9. // .keys()
  10. // v 输出数组中的 "键" 对组成的数组
  11. // .values()
  12. // v 输出数组中的 "值" 对组成的数组
  13. // ! 默认调用values(),输出值
  14. // for (let 变量 of 数组.entries()) {
  15. // console.log(变量);
  16. // }
  17. // 上面这个变量,也是数组成员的意思
  18. // for -of是针对数组使用
  19. for (let shuzu of niuniu.entries()) {
  20. console.log(shuzu);
  21. }
  22. for (let shuzu of niuniu.keys()) {
  23. console.log(shuzu);
  24. // 提取键
  25. }
  26. for (let shuzu of niuniu.values()) {
  27. console.log(shuzu);
  28. // 提取的键值对的对
  29. }
  30. for (let shuzu of niuniu) {
  31. console.log(shuzu);
  32. // 默认提取的键值对的对
  33. }

示例截图:

for in语法:

  1. for (let 变量/数组成员 in 数组) {
  2. console.log(数组[变量/数组成员]);
  3. }

示例代码:

  1. // for -in是针对对象使用
  2. // 遍历对象跟遍历数组稍微有一点不同;
  3. // 遍历对象是以下写法;
  4. // for (let 变量/数组成员 in 数组) {
  5. // console.log(数组[变量/数组成员]);
  6. // }
  7. // 上面这个变量也是数组成员的意思
  8. let niuniu1 = {
  9. name: "名字",
  10. name2: "名字2",
  11. name3: "名字3",
  12. };
  13. for (let shuzu1 in niuniu1) {
  14. console.log(niuniu1[shuzu1]);
  15. }
  16. for (let shuzu of niuniu.values()) {
  17. console.log(shuzu);
  18. }
  19. // 数组数组 数组 数组也是对象
  20. for (let shuzu2 in niuniu) {
  21. console.log(niuniu[shuzu2]);
  22. }

函数的参数与返回值
参数不足及参数过多的解决方案

参数不足的解决方案:
其实就是在方法里面默认一个参数,默认之后再调用结果的时候,并不会影响到调用时的结果.
直接上代码部分:

  1. let ad = (a, b) => a + b;
  2. console.log(ad(1, 2));
  3. console.log(ad(1));
  4. ad = (a, b = 0) => a + b;
  5. console.log(ad(1));
  6. console.log(ad(5, 5));
  7. // 在参数返回值不足的情况下,给当前函数对象一个默认返回值即可
  8. ad = function mingzi(a, b = 0) {
  9. return a + b;
  10. };
  11. console.log(ad(1, 2));
  12. function mingzi(a, b) {
  13. return a + b;
  14. }
  15. console.log(mingzi(1, 2));

示例截图:

参数过多的解决方案:

使用… rest语法,剩余参数,归并参数,将所以参数全部压入到一个数组中
…语法还可以将集合展开

将数组压入到一个数组中
  1. // 将多余的数字,可以以数组的方式全部接收
  2. // ! ...: rest语法,剩余参数,归并参数,将所以参数全部压入到一个数组中
  3. ad = (...c) => c;
  4. console.log(ad(1, 2, 3, 4, 5, 6));
  5. // 将所有的数字,压缩成数组,放到...c中

示例截图:

示例2:赋值方式:

  1. ad = (a, b, ...shuzu) => `${a},${b},${shuzu}`;
  2. console.log(ad(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

示例截图:

将数组展开

示例代码:

  1. // 将集合数据展开
  2. console.log(...[1, 2, 3, 4, 5]);
  3. let ad1 = [1, 2, 3, 4, 5, 6, 7, 8];
  4. console.log(...ad1);

示例截图:

花絮部分,老师写的箭头函数代码,老师说我们还没学到,我就暂时先对代码还原成了非箭头函数

  1. let f = (...arr) => arr.reduce((a, c) => a + c);
  2. console.log(f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  3. //没学高阶函数,那就先给老师的讲解进行还原
  4. f = function (...arr) {
  5. return arr.reduce(function (a, c) {
  6. return a + c;
  7. });
  8. };
  9. console.log(f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  10. // 从服务器API接口获取到了个商品列表: JSON数组
  11. const list = ["笔记本电脑", "小米12手机", "佳能 EOS-R相机"];
  12. console.log(list);
  13. // 将每个商品,套上html标签,最终渲染到html页面中
  14. f = (...items) => items.map(item => `<li>${item}</li>`).join("");
  15. console.log(f(...list));
  16. // document.body.innerHTML = "<ul>" + f(...list) + "</ul>";
  17. qq = function (...items) {
  18. return items
  19. .map(function (item) {
  20. return `<li>${item}</li>`;
  21. })
  22. .join("");
  23. };
  24. console.log(qq(...list));

代码运行参数截图:

利用函数返回多个值

  1. / ! 返回值
  2. // p 函数默认:'单值返回'
  3. // y 如何返回多个值?
  4. // 数组
  5. qq = () => [1, 2, 3, 4, 5];
  6. console.log(qq());
  7. // 拆分处理
  8. console.log(...qq());
  9. // 结合for of循环提取键跟值
  10. for (let tiqu of qq().entries()) {
  11. console.log(tiqu);
  12. }
  13. for (let tiqu of qq().keys()) {
  14. console.log(tiqu);
  15. }
  16. console.log(qq());
  17. // 对象
  18. qq = () => ({ name: "名字", Name: "名字2", nAme: "名字三" });
  19. console.log(qq());
  20. // 还原以上函数
  21. //对象
  22. let qq1 = function () {
  23. return { name: "名字", Name: "名字2", nAme: "名字三" };
  24. };
  25. console.log(qq1());
  26. // 结合for in循环提取
  27. for (let tiqu in qq1()) {
  28. console.log(qq1()[tiqu]);
  29. }
对象字面量的简化

对象字面量的简化 推荐使用部分

属性简化

1 变量name 与 属性name 同名
2且在同一个作用域中,可以不写变量名
代码部分:

  1. //对象字面量的简化 推荐使用部分
  2. //先声明一个变量
  3. let name = "小明";
  4. let a = {
  5. name: name,
  6. };
  7. console.log(a.name);
  8. // 简化
  9. a = {
  10. name,
  11. };
  12. console.log(a.name);
  13. // name: "猪老湿",
  14. // name: name,
  15. // * 1 变量name 与 属性name 同名
  16. // * 2且在同一个作用域中,可以不写变量名
  17. // 不加this返回的是数组的值
  18. a = () => name;
  19. console.log(a());

示例截图:

方法简化

所谓方法:本质仍是属性,只不过它的值是一个函数声明
在对象中的函数中,是简化,将 ”: function” 删除
并且记住:
箭头函数如果用到 this, 就不要用到对象字面量方法中
this: 普通函数, 调用时确定
this: 箭头函数, 声明时确定

先贴一个老师写的部分: 先贴一个老师写的部分:
  1. user = {
  2. name,
  3. // 所谓方法:本质仍是属性,只不过它的值是一个函数声明
  4. // getName: function () {
  5. // return this.name;
  6. // },
  7. // 简化,将 ”: function" 删除
  8. getName() {
  9. return this.name;
  10. },
  11. // 箭头函数
  12. getName1: () => user.name,
  13. // 箭头函数如果用到 this, 就不要用到对象字面量方法中
  14. // this: 普通函数, 调用时确定
  15. // this: 箭头函数, 声明时确定
  16. };
  17. console.log(user.getName());
  18. console.log(user.getName1());

自己的代码:

  1. // 方法简化 对象内有数组的情况
  2. a = {
  3. name,
  4. ab: function () {
  5. return a.name;
  6. },
  7. };
  8. console.log(a.ab());
  9. a = {
  10. name,
  11. ab: function () {
  12. return this.name;
  13. },
  14. };
  15. console.log(a.ab());
  16. // 简写
  17. a = {
  18. name,
  19. ab: () => a.name,
  20. ac() {
  21. return this.name;
  22. },
  23. };
  24. console.log(a.ab());
  25. console.log(a.ac());

示例截图:

模板字面量与模板函数

先说模板字面量,算是一个较为好理解的.
模板字面量可以在传统的代码中插入插值,甚至可以计算以及放入块元素
使用到的符号为 打不出来,就是在键盘TAB上面那个键,也是在键盘左上角,esc下面那个站,键盘1旁边那个键,在使用字面量中,如果字面量中有变量,需要用${变量不限于一个}包裹,在计算中,包裹的变量是${a+b}这种,放入块元素时,需要对非变量,也就是字符部分需要用(没办法打不出来,就是tab上面那个键)符号包裹起来,直接上示例代码及图吧

  1. //模板字面量与模板函数
  2. // 模板字面量
  3. // 传统如下:
  4. console.log("你好啊php");
  5. // 模板字面量可以在传统的代码中插入插值
  6. let php = "php";
  7. console.log(php);
  8. console.log("你好" + php);
  9. console.log(`你好${php}`);
  10. // 还可以进行计算使用
  11. console.log(`1+1=${1 + 1}`);
  12. //甚至可以放入块元素
  13. console.log(`${10 > 1 ? `大于` : `小于`}`);

刚刚看到一份老师的解释,贴出来

  1. /**
  2. * * 模板字面量: 可以使用插值表达式的字符串
  3. * * 模板函数: 可以使用"模板字面量"为参数的函数
  4. * * 模板函数,就是在"模板字面量"之前加一个标签/标识符,而这个标签,就是一个函数名
  5. * * 模板函数的参数是有约定的, 不能乱写, 第一个是字面量数组,从第二起才是内部的占位符参数
  6. */
  7. // v 模板字面量, 也叫"模板字符串" , 是同义词,我觉得用"模板字面量"更直观,准确
  8. // v 模板函数, 有的书也翻译与"标签函数", 因为 它使用"模板字面量"做参数,称为"模板函数"更直观, 一看知识必须传一个模板字面量当参数

我的示例截图:

模板函数

模板函数也比较有意思,在声明成模板函数时,函数里面的第一个参数将变成数组,剩下那俩还是参数,在调用中,字符串的部分,将储存到数组中,也就是第一个参数中,在调用其他俩参数时,需要用${}来包裹,第一个参数既然已经成为了数组,那么调用他的方式,将以数组的方式调用.本来已经写完了,刚刚又看到老师的最后一段代码,发现一个事情,是模板函数中,…rest 将插值进行合并,如果使用$(数字)传入的参数值,那么此参数将直接传值给函数里面,看第三份示例图下面的代码
先上一份截图:

再上一份定义为模板函数的

代码部分:

  1. // 当函数声明使用函数模板时,函数声明内的第一个对象变为数组,后面的为值
  2. // function name(string, y, q) {
  3. // console.log(string);
  4. // console.log(y, q);
  5. // let jiage = ` ${string[0]} ${y} ${string[1]} ${q} ${string[2]} ${y * q}${string[3]} `;
  6. // console.log(jiage)
  7. // }
  8. // let y = 10;
  9. // let q = 20;
  10. // name`当前的蔬菜价格单价为${y}数量为${q}总价格为 ${y * q}元`;
  11. function name(string, y, q) {
  12. console.log(string);
  13. console.log(y, q);
  14. let jiage = ` ${string[0]} ${y} ${string[1]} ${q} ${string[2]} ${y * q}${string[3]} `;
  15. console.log(jiage);
  16. }
  17. let y = 10;
  18. let q = 20;
  19. // 使用函数模板时不需要加(),如下 name``;
  20. name`当前的蔬菜价格单价为${y}数量为${20}总价格为 ${y * q}元`;
  21. // name();
  22. // name``;
  23. // console.log(name(1, y, q));

代码示例截图:

调用的代码部分:

  1. // ! 模板函数的优化, 以后只用这一种, 上面也要能看懂
  2. // * 使用 ...rest 将插值进行合并
  3. function sum(strings, ...args) {
  4. console.log(strings);
  5. console.log(args);
  6. console.log(`[${args.join()}] 之和是: ${args.reduce((a, c) => a + c)}`);
  7. }
  8. // 调用
  9. sum`计算多个数和: ${1}${2}${3}${4}`;

示例截图:

get代码:
.join()将数组以字符串方式返回
.reduce数组内的数据总和

老师下面的就不用看了,自己写的代码,保存一下 后面自己学习用
先贴老师的:
流程分支

  1. // todo 流程控制 : 分支
  2. /**
  3. * * 程序默认执行流程:
  4. * * 1. 顺序: (默认)
  5. * * 2. 分支: 单分支, 双分支, 多分支
  6. * * 3. 循环: 单分支的重复执行
  7. */
  8. // 代码块
  9. {
  10. console.log("Hello php.cn");
  11. }
  12. // ! 分支: 有条件的执行某个代码块
  13. // * 单分支: 仅当表达式计算结果为真时, 才执行代码块
  14. let age = 28;
  15. // age >= 18 true: 执行
  16. if (age >= 18) {
  17. console.log("允许观看");
  18. }
  19. // 如果为false, 怎么办?
  20. // 创建一个分支: 默认分支, else
  21. // ! 双分支: 有一个"默认分支"
  22. age = 15;
  23. if (age >= 18) {
  24. console.log("允许观看");
  25. }
  26. // * 默认分支
  27. else {
  28. console.log("少儿不宜");
  29. }
  30. // ! 双分支的简化
  31. // ! 双分支属于高频操作, 系统提供了一个"语法糖"(简化方案): 三元
  32. // * 语法: (条件) ? true : false
  33. age = 50;
  34. let res = age >= 18 ? "允许观看" : "少儿不宜";
  35. console.log(res);
  36. // ! 多分支: 有多个"默认分支"
  37. age = 4;
  38. if (age >= 18 && age < 35) {
  39. console.log("允许单独观看");
  40. }
  41. // * 第1个默认分支
  42. else if (age >= 35 && age < 60) {
  43. console.log("建议二人观看");
  44. }
  45. // * 第2个默认分支
  46. else if (age >= 60 && age < 120) {
  47. console.log("建议在家人陪同下观看");
  48. }
  49. // * 第3个默认分支: 异常分支, 使用 "||" 或 , 满足条件之一就可以了, true
  50. else if (age <= 3 || age >= 120) {
  51. console.log("非法年龄");
  52. }
  53. // * 默认分支(可选)
  54. else {
  55. console.log("少儿不宜");
  56. }
  57. // 传统多分, if - else if - else if --- , 代码混乱
  58. // switch 进行优化
  59. // ! 多分支 switch
  60. age = 18;
  61. // * 区间判断, 使用 true
  62. switch (true) {
  63. case age >= 18 && age < 35:
  64. console.log("允许单独观看");
  65. break;
  66. case age >= 35 && age < 60:
  67. console.log("建议二人观看");
  68. break;
  69. case age > 60 && age < 120:
  70. console.log("请在家人陪同下观看");
  71. break;
  72. case age <= 3 || age >= 120:
  73. console.log("非法年龄");
  74. break;
  75. default:
  76. console.log("少儿不宜");
  77. }
  78. // * 单值判断: 变量
  79. let lang = "html";
  80. lang = "css";
  81. lang = "javascript";
  82. lang = "js";
  83. lang = "CSS";
  84. lang = "JavaScript";
  85. // lang = "HTML";
  86. console.log(lang.toLowerCase());
  87. switch (lang.toLowerCase()) {
  88. // 将传入的进行判断的变量值,进行统一化
  89. // 将传入的字符串, 全部小写, 或者 大写
  90. case "html":
  91. console.log("超文本标记语言");
  92. break;
  93. case "css":
  94. console.log("层叠样式表");
  95. break;
  96. case "javascript":
  97. case "js":
  98. console.log("通用前端脚本编程语言");
  99. break;
  100. default:
  101. console.log("不能识别");
  102. }

流程控制循环:

  1. // todo 流程控制: 循环
  2. const colors = ["red", "green", "blue"];
  3. // 0: red, 1: green, 2: blue
  4. // * 1. 从哪开始? 2. 到哪结束? 索引从 0 开始, 到2 结束
  5. console.log(colors[0], colors[1], colors[2]);
  6. //array是一个对象, 是对象就会有属性或方法
  7. // colors.length 数组长度, 数组内的成员数量
  8. console.log(colors.length);
  9. // 最后一个
  10. console.log(colors[2]);
  11. console.log(colors[colors.length - 1]);
  12. // 遍历结束的标记, 数组越界了, undefined
  13. console.log(colors[3]);
  14. console.log(colors[colors.length]);
  15. // * 1. 起始索引
  16. let i = 0;
  17. // * 2. 循环条件
  18. let length = colors.length;
  19. // i < colors.length 直到 i === 3 , i === colors.length的时候,遍历结束
  20. // * 3. 更新条件
  21. // 让数据的索引,自动指向下一个成员, 更新必须在代码块中
  22. // ! 必须更新条件,否则进入死循环
  23. // 第1次遍历
  24. if (i < length) {
  25. console.log(colors[i]);
  26. // * 更新条件, 将 i 指向下一个元素的索引
  27. // i = i + 1;
  28. // i += 1;
  29. // 如果每一次都递增 1, 还可进一步简化
  30. i++;
  31. }
  32. console.log(i);
  33. // 第2次遍历
  34. if (i < length) {
  35. console.log(colors[i]);
  36. // * 更新条件
  37. i++;
  38. }
  39. console.log(i);
  40. // 第3次遍历
  41. if (i < length) {
  42. console.log(colors[i]);
  43. // * 更新条件
  44. i++;
  45. }
  46. console.log(i);
  47. // 第4次遍历, 3 === length, i<length 为 false 不执行了
  48. if (i < length) {
  49. console.log(colors[i]);
  50. // * 更新条件
  51. i++;
  52. }
  53. console.log(i);
  54. // ! while 循环
  55. // * while 可以将上面的多次的if()遍历进行合并
  56. i = 0;
  57. while (i < length) {
  58. console.log(colors[i]);
  59. // * 更新条件
  60. i++;
  61. }
  62. /**
  63. * * 循环三条件
  64. * * 1. 初始条件: 数组索引的引用 ( i = 0 )
  65. * * 2. 循环条件: 为真才执行循环体 ( i < arr.length )
  66. * * 3. 更新条件: 必须要有,否则进入死循环 ( i++ )
  67. */
  68. // //while()入口型判断
  69. // * do {} while(), 出口型判断,无论条件是否成立, 必须执行一次代码块
  70. i = 0;
  71. do {
  72. console.log(colors[i]);
  73. // * 更新条件
  74. i++;
  75. } while (i > length);
  76. // ! for () 是 while 的简化
  77. // * 语法: for (初始条件; 循环条件; 更新条件) {...}
  78. for (let i = 0; i < colors.length; i++) {
  79. console.log(colors[i]);
  80. }
  81. // 优化, 将数组长度,提前计算出来缓存到一个变量中
  82. for (let i = 0, length = colors.length; i < length; i++) {
  83. console.log(colors[i]);
  84. }
  85. // ! for - of : 快速迭代处理集合数据
  86. // * 数组内部有一个迭代器的方法, 可以用for-of
  87. // * for-of优点: 用户不必再去关心索引, 而将注意力集中到数组成员上
  88. // v 输出数组中的 "键值" 对组成的数组
  89. for (let item of colors.entries()) {
  90. console.log(item);
  91. }
  92. // v 输出数组中的 "键" 对组成的数组
  93. for (let item of colors.keys()) {
  94. console.log(item);
  95. }
  96. // v 输出数组中的 "值" 对组成的数组
  97. for (let item of colors.values()) {
  98. console.log(item);
  99. }
  100. // ! 默认调用values(),输出值
  101. for (let item of colors) {
  102. console.log(item);
  103. }
  104. // ! for - in: 遍历对象
  105. const obj = { a: 1, b: 2, c: 3, say: function () {} };
  106. // 遍历对象
  107. for (let key in obj) {
  108. console.log(obj[key]);
  109. }
  110. // 数组也是对象
  111. for (let i in colors) {
  112. console.log(colors[i]);
  113. }
  114. // 数组也能用for-in,但不要这么用, for - of, forEach, map...

函数的参数与返回值

  1. // ! 函数的参数与返回值
  2. // y 1. 参数不足: 默认参数
  3. let f = (a, b) => a + b;
  4. console.log(f(1, 2));
  5. // Nan: Not a Number
  6. console.log(f(1));
  7. // * 解决方案: 默认参数
  8. f = (a, b = 0) => a + b;
  9. console.log(f(1));
  10. console.log(f(1, 2));
  11. // y 2. 参数过多, ...rest
  12. f = (a, b) => a + b;
  13. // 多余的参数3,4忽略了
  14. console.log(f(1, 2, 3, 4));
  15. // 怎么将多余的参数,全部接收? ...rest
  16. f = (...arr) => arr;
  17. // ! ...: rest语法,剩余参数,归并参数,将所以参数全部压入到一个数组中
  18. console.log(f(1, 2, 3, 4, 5));
  19. // ...集合数据,可以将它"展开"成一个个独立的元素,用在调用的时候
  20. console.log(...[1, 2, 3, 4]);
  21. f = (a, b, ...arr) => `${a}, ${b}, ${arr}`;
  22. f = (a, b, ...arr) => `${a}, ${b}, ${arr}`;
  23. // f = function (a, b, ...arr) {
  24. // return a',' b',' arr;
  25. // };
  26. console.log(f(1, 2, 3, 4, 5, 6));
  27. f = (a, b, ...arr) => arr;
  28. console.log(f(1, 2, 3, 4, 5, 6));
  29. // 计算任何数量的数据之和
  30. f = (...arr) => arr.reduce((a, c) => a + c);
  31. console.log(f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  32. // 从服务器API接口获取到了个商品列表: JSON数组
  33. const list = ["笔记本电脑", "小米12手机", "佳能 EOS-R相机"];
  34. console.log(list);
  35. // 将每个商品,套上html标签,最终渲染到html页面中
  36. f = (...items) => items.map(item => `<li>${item}</li>`).join("");
  37. console.log(f(...list));
  38. // document.body.innerHTML = "<ul>" + f(...list) + "</ul>";
  39. // ! 返回值
  40. // p 函数默认:'单值返回'
  41. // y 如何返回多个值?
  42. // * 数组
  43. f = () => [1, 2, 3];
  44. console.log(f());
  45. // * 对象: 模块
  46. f = () => ({ a: 1, b: 2, get: function () {} });
  47. console.log(f());

对象字面量的简化:

  1. // y 对象字面量的简化,推荐使用
  2. let name = "猪老湿";
  3. // ! 属性简化
  4. let user = {
  5. // name: "猪老湿",
  6. // name: name,
  7. // * 1 变量name 与 属性name 同名
  8. // * 2且在同一个作用域中,可以不写变量名
  9. name,
  10. };
  11. console.log(user.name);
  12. // ! 方法简化
  13. user = {
  14. name,
  15. // 所谓方法:本质仍是属性,只不过它的值是一个函数声明
  16. // getName: function () {
  17. // return this.name;
  18. // },
  19. // 简化,将 ”: function" 删除
  20. getName() {
  21. return this.name;
  22. },
  23. // 箭头函数
  24. getName1: () => user.name,
  25. // 箭头函数如果用到 this, 就不要用到对象字面量方法中
  26. // this: 普通函数, 调用时确定
  27. // this: 箭头函数, 声明时确定
  28. };
  29. console.log(user.getName());
  30. console.log(user.getName1());

模板字面量与模板函数

  1. // y 模板字面量 与 模板函数
  2. // ! 模板字面量
  3. // 传统
  4. console.log("hello world");
  5. // 模板字面量
  6. console.log(`hello world`);
  7. // 模板字面量中,可以使用"插值"(变量,表达式),可以解析变量
  8. let name = "朱老师";
  9. console.log("Hello " + name);
  10. // 变量/表达式等插值,使用 ${...}插入到模板字面量中
  11. console.log(`Hello ${name}`);
  12. console.log(`10 + 20 = ${10 + 20}`);
  13. console.log(`${10 < 20 ? `大于` : `小于`}`);
  14. // ! 模板函数
  15. // * 就是使用"模板字面量'为参数的函数
  16. //* 模板函数(第一个参数是字面量组成的数组,第二个参数起,是字面量中的插值列表)
  17. // y 声明模板函数
  18. function total(strings, num, price) {
  19. console.log(strings);
  20. console.log(num, price);
  21. }
  22. let num = 10;
  23. let price = 20;
  24. // y 调用模板函数
  25. total`数量: ${10}单价:${500},${10}`;
  26. // ! 模板函数的优化, 以后只用这一种, 上面也要能看懂
  27. // * 使用 ...rest 将插值进行合并
  28. function sum(strings, ...args) {
  29. console.log(strings);
  30. console.log(args);
  31. console.log(`[${args.join()}] 之和是: ${args.reduce((a, c) => a + c)}`);
  32. }
  33. // 调用
  34. sum`计算多个数和: ${1}${2}${3}${4}`;
  35. /**
  36. * * 模板字面量: 可以使用插值表达式的字符串
  37. * * 模板函数: 可以使用"模板字面量"为参数的函数
  38. * * 模板函数,就是在"模板字面量"之前加一个标签/标识符,而这个标签,就是一个函数名
  39. * * 模板函数的参数是有约定的, 不能乱写, 第一个是字面量数组,从第二起才是内部的占位符参数
  40. */
  41. // v 模板字面量, 也叫"模板字符串" , 是同义词,我觉得用"模板字面量"更直观,准确
  42. // v 模板函数, 有的书也翻译与"标签函数", 因为 它使用"模板字面量"做参数,称为"模板函数"更直观, 一看知识必须传一个模板字面量当参数

自己的部分:

流程控制:

  1. // 流程控制分支
  2. // 默认分支
  3. // 顺序分支,顺序分支又分为单分支, 双分支,多分支
  4. // 循环分支
  5. // 代码块
  6. {
  7. console.log("我爱你");
  8. }
  9. // 分支的意思就是有条件的时候,执行
  10. // 单分支,就是执行的时候判断一次,只有一个分支结果
  11. // 声明一个变量
  12. let love = 10;
  13. if (love >= 10) {
  14. console.log("我爱你十分");
  15. }
  16. // 双分支
  17. // 有一个默认分支,除了判断的那个分支外,当找不到当前匹配的结果时,默认的那个分支
  18. love = 16;
  19. if (love <= 15) {
  20. console.log("你对我的爱还没有十五分");
  21. } else {
  22. console.log("还是你比较爱我,都超过15分了");
  23. }
  24. // 双分支的简化
  25. // 需要用一个变量声明来做
  26. let ai = love <= 15 ? "你对我的爱还没有十五分" : "还是你厉害,爱死我了,对我的爱都超过15分了";
  27. console.log(ai);
  28. // 语法请记住,双支判断的时候,是 判断语法 ? true : false;
  29. // 多分支
  30. love = 55;
  31. if (love <= 10) {
  32. console.log("我还没超过十岁拉");
  33. } else if (love > 10 && love <= 20) {
  34. console.log("我在10到20岁之间");
  35. } else if (love >= 21 && love <= 35) {
  36. console.log("我还是青春期吗???");
  37. } else if (love >= 36 && love <= 50) {
  38. console.log("我现在是青壮年??");
  39. } else if (love >= 51 && love <= 60) {
  40. console.log("我这年级上不了班了,在家待业吧,要不就看个大门吧");
  41. } else if (love >= 60) {
  42. console.log("超过60啦,在家哄小孩啦");
  43. }
  44. // 多分支优化版本
  45. love = 50;
  46. switch (true) {
  47. case love > 10 && love <= 20:
  48. console.log("我在十岁到20岁之间");
  49. break;
  50. case love >= 21 && love <= 35:
  51. console.log("我还是青春期吗???");
  52. default:
  53. console.log("你猜猜我几岁");
  54. }
  55. // love = 10;
  56. // switch (true) {
  57. // case love > 10 && love <= 20:
  58. // console.log ("我还没超过十岁拉");
  59. // break;
  60. // default:
  61. // console.log("我在10到20岁之间");
  62. // }
  63. // 单值判断变量
  64. let zhan = "dedecms";
  65. // 还可以对字符格式化处理,比如别人提供的api是大小写字母等操作,我们需要对大小写进行格式化
  66. zhan = "Diguocms";
  67. zhan = "Zblog";
  68. // 将传入的进行判断的变量值,进行统一化
  69. // 将传入的字符串, 全部小写, 或者 大写
  70. switch (zhan.toLocaleLowerCase()) {
  71. case "dedecms":
  72. console.log("目前使用的织梦cms");
  73. break;
  74. case "diguocms":
  75. console.log("目前使用的帝国cms");
  76. break;
  77. case "zblog":
  78. console.log("目前使用zblog博客程序");
  79. break;
  80. default:
  81. console.log("可能大佬用的discuz吧");
  82. break;
  83. }

流程控制与循环

  1. // 先声明一个数组类常量
  2. const niuniu = ["niu", "luotuo", "feiji"];
  3. // 打印一下
  4. console.log(niuniu[0], niuniu[1], niuniu[2]);
  5. // 当前的索引是从0开始,0 , 1, 2
  6. // array是一个数组, 数组就是对象, 既然是对象就有方法和属性;
  7. console.log(niuniu.length);
  8. // .length 打印当前数组的长度.数组名.length
  9. // 当前属性是打印数组的长度,当前数组有三个对象,;
  10. console.log(niuniu[2]);
  11. console.log(niuniu[3]);
  12. // 提示越界了,没有这个参数
  13. console.log(niuniu.length - 1);
  14. console.log(niuniu[niuniu.length - 1]);
  15. console.log(niuniu[niuniu.length]);
  16. // 因为数组的长度是3,但是数组是从0开始的,结束就为2,所以超出越界了,因为数组的索引是从0开始
  17. // 先声明一个当前索引
  18. let a = 0;
  19. let b = niuniu.length;
  20. // 遍历循环数据的三个条件, 1,起始索引, 2,更新, 3,结束
  21. if (a < b) {
  22. console.log(niuniu[a]);
  23. a = a + 1;
  24. }
  25. if (a < b) {
  26. console.log(niuniu[a]);
  27. a = a + 1;
  28. }
  29. if (a < b) {
  30. console.log(niuniu[a]);
  31. a = a + 1;
  32. // 或者a++,意思一样
  33. }
  34. a = 0;
  35. while (a < b) {
  36. console.log(niuniu[a]);
  37. a++;
  38. }
  39. /**
  40. * * 循环三条件
  41. * * 1. 初始条件: 数组索引的引用 ( i = 0 )
  42. * * 2. 循环条件: 为真才执行循环体 ( i < arr.length )
  43. * * 3. 更新条件: 必须要有,否则进入死循环 ( i++ )
  44. */
  45. // //while()入口型判断
  46. // * do {} while(), 出口型判断,无论条件是否成立, 必须执行一次代码块
  47. a = 0;
  48. do {
  49. console.log(niuniu[a]);
  50. a++;
  51. } while (a < niuniu.length);
  52. // do循环是先执行一遍,然后才是判断语句
  53. // ! for () 是 while 的简化
  54. // * 语法: for (初始条件; 循环条件; 更新条件) {...}
  55. for (a = 0; a < niuniu.length; a++) {
  56. console.log(niuniu[a]);
  57. }
  58. // 优化方案
  59. // 这个理解为,初始条件为a等于0,b是数组长度,当a小于数组长度时,a自身+1
  60. // 优化, 将数组长度,提前计算出来缓存到一个变量中
  61. for (a = 0, b = niuniu.length; a < b; a++) {
  62. console.log(niuniu[a]);
  63. }
  64. // ! for - of : 快速迭代处理集合数据
  65. // * 数组内部有一个迭代器的方法, 可以用for-of
  66. // * for-of优点: 用户不必再去关心索引, 而将注意力集中到数组成员上
  67. // 感觉for - of 是魔改版本,因为他缺少了起始和更新条件,只有一个数组成员,而数组成员直接赋值给了变量,变成了数组
  68. // 写法是:
  69. // 使用到一个新的对象方法,
  70. // .entries() 数组成员
  71. // v 输出数组中的 "键值" 对组成的数组
  72. // .keys()
  73. // v 输出数组中的 "键" 对组成的数组
  74. // .values()
  75. // v 输出数组中的 "值" 对组成的数组
  76. // ! 默认调用values(),输出值
  77. // for (let 变量 of 数组.entries()) {
  78. // console.log(变量);
  79. // }
  80. // 上面这个变量,也是数组成员的意思
  81. // for -of是针对数组使用
  82. for (let shuzu of niuniu.entries()) {
  83. console.log(shuzu);
  84. }
  85. for (let shuzu of niuniu.keys()) {
  86. console.log(shuzu);
  87. // 提取键
  88. }
  89. for (let shuzu of niuniu.values()) {
  90. console.log(shuzu);
  91. // 提取的键值对的对
  92. }
  93. for (let shuzu of niuniu) {
  94. console.log(shuzu);
  95. // 默认提取的键值对的对
  96. }
  97. // for -in是针对对象使用
  98. // 遍历对象跟遍历数组稍微有一点不同;
  99. // 遍历对象是以下写法;
  100. // for (let 变量/数组成员 in 数组) {
  101. // console.log(数组[变量/数组成员]);
  102. // }
  103. // 上面这个变量也是数组成员的意思
  104. let niuniu1 = {
  105. name: "名字",
  106. name2: "名字2",
  107. name3: "名字3",
  108. };
  109. for (let shuzu1 in niuniu1) {
  110. console.log(niuniu1[shuzu1]);
  111. }
  112. for (let shuzu of niuniu.values()) {
  113. console.log(shuzu);
  114. }
  115. // 数组数组 数组 数组也是对象
  116. for (let shuzu2 in niuniu) {
  117. console.log(niuniu[shuzu2]);
  118. }

函数的参数与返回值

  1. //函数的参数与返回值
  2. //函数的参数返回值不足的情况
  3. let ad = (a, b) => a + b;
  4. console.log(ad(1, 2));
  5. console.log(ad(1));
  6. ad = (a, b = 0) => a + b;
  7. console.log(ad(1));
  8. console.log(ad(5, 5));
  9. // 在参数返回值不足的情况下,给当前函数对象一个默认返回值即可
  10. ad = function mingzi(a, b = 0) {
  11. return a + b;
  12. };
  13. console.log(ad(1, 2));
  14. function mingzi(a, b) {
  15. return a + b;
  16. }
  17. console.log(mingzi(1, 2));
  18. // 以上为非简体写法
  19. ad = (a, b) => a + b;
  20. console.log(ad(1, 2, 3, 4, 5));
  21. // 1+2=3,所以只能显示2个
  22. // 显示只显示前俩 后面的并没有显示
  23. // 将多余的数字,可以以数组的方式全部接收
  24. // ! ...: rest语法,剩余参数,归并参数,将所以参数全部压入到一个数组中
  25. ad = (...c) => c;
  26. console.log(ad(1, 2, 3, 4, 5, 6));
  27. // 将所有的数字,压缩成数组,放到...c中
  28. // 将集合数据展开
  29. console.log(...[1, 2, 3, 4, 5]);
  30. let ad1 = [1, 2, 3, 4, 5, 6, 7, 8];
  31. console.log(...ad1);
  32. ad = (a, b, ...shuzu) => `${a},${b},${shuzu}`;
  33. console.log(ad(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  34. let f = (...arr) => arr.reduce((a, c) => a + c);
  35. console.log(f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  36. //没学高阶函数,那就先给老师的讲解进行还原
  37. f = function (...arr) {
  38. return arr.reduce(function (a, c) {
  39. return a + c;
  40. });
  41. };
  42. console.log(f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  43. // 从服务器API接口获取到了个商品列表: JSON数组
  44. const list = ["笔记本电脑", "小米12手机", "佳能 EOS-R相机"];
  45. console.log(list);
  46. // 将每个商品,套上html标签,最终渲染到html页面中
  47. f = (...items) => items.map(item => `<li>${item}</li>`).join("");
  48. console.log(f(...list));
  49. // document.body.innerHTML = "<ul>" + f(...list) + "</ul>";
  50. qq = function (...items) {
  51. return items
  52. .map(function (item) {
  53. return `<li>${item}</li>`;
  54. })
  55. .join("");
  56. };
  57. console.log(qq(...list));
  58. // ! 返回值
  59. // p 函数默认:'单值返回'
  60. // y 如何返回多个值?
  61. // 数组
  62. qq = () => [1, 2, 3, 4, 5];
  63. console.log(qq());
  64. // 拆分处理
  65. console.log(...qq());
  66. // 结合for of循环提取键跟值
  67. for (let tiqu of qq().entries()) {
  68. console.log(tiqu);
  69. }
  70. for (let tiqu of qq().keys()) {
  71. console.log(tiqu);
  72. }
  73. console.log(qq());
  74. // 对象
  75. qq = () => ({ name: "名字", Name: "名字2", nAme: "名字三" });
  76. console.log(qq());
  77. // 还原以上函数
  78. //对象
  79. let qq1 = function () {
  80. return { name: "名字", Name: "名字2", nAme: "名字三" };
  81. };
  82. console.log(qq1());
  83. // 结合for in循环提取
  84. for (let tiqu in qq1()) {
  85. console.log(qq1()[tiqu]);
  86. }

对象字面量的简化

  1. //对象字面量的简化 推荐使用部分
  2. //先声明一个变量
  3. let name = "小明";
  4. let a = {
  5. name: name,
  6. };
  7. console.log(a.name);
  8. // 简化
  9. a = {
  10. name,
  11. };
  12. console.log(a.name);
  13. // 不加this返回的是数组的值
  14. a = () => name;
  15. console.log(a());
  16. // 方法简化 对象内有数组的情况
  17. a = {
  18. name,
  19. ab: function () {
  20. return a.name;
  21. },
  22. };
  23. console.log(a.ab());
  24. a = {
  25. name,
  26. ab: function () {
  27. return this.name;
  28. },
  29. };
  30. console.log(a.ab());
  31. // 简写
  32. a = {
  33. name,
  34. ab: () => a.name,
  35. ac() {
  36. return this.name;
  37. },
  38. };
  39. console.log(a.ab());
  40. console.log(a.ac());

模板字面量与模板函数

  1. //模板字面量与模板函数
  2. // 模板字面量
  3. // 传统如下:
  4. console.log("你好啊php");
  5. // 模板字面量可以在传统的代码中插入插值
  6. let php = "php";
  7. console.log(php);
  8. console.log("你好" + php);
  9. console.log(`你好${php}`);
  10. // 还可以进行计算使用
  11. console.log(`1+1=${1 + 1}`);
  12. //甚至可以放入块元素
  13. console.log(`${10 > 1 ? `大于` : `小于`}`);
  14. // 当函数声明使用函数模板时,函数声明内的第一个对象变为数组,后面的为值
  15. // function name(string, y, q) {
  16. // console.log(string);
  17. // console.log(y, q);
  18. // let jiage = ` ${string[0]} ${y} ${string[1]} ${q} ${string[2]} ${y * q}${string[3]} `;
  19. // console.log(jiage)
  20. // }
  21. // let y = 10;
  22. // let q = 20;
  23. // name`当前的蔬菜价格单价为${y}数量为${q}总价格为 ${y * q}元`;
  24. function name(string, y, q) {
  25. console.log(string);
  26. console.log(y, q);
  27. let jiage = ` ${string[0]} ${y} ${string[1]} ${q} ${string[2]} ${y * q}${string[3]} `;
  28. console.log(jiage);
  29. }
  30. let y = 10;
  31. let q = 20;
  32. // 使用函数模板时不需要加(),如下 name``;
  33. name`当前的蔬菜价格单价为${y}数量为${20}总价格为 ${y * q}元`;
  34. // name();
  35. // name``;
  36. // console.log(name(1, y, q));
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议