JavaScript编程基础(二)流程控制,函数与解构

原创 阁主  2023-08-02 15:06:59  阅读 699 次 评论 0 条
摘要:

继续上次的JavaScript编程基础(一)继续学习,简单记录学习PHP中文网23期JavaScript基础知识,内容包括:流程控制,函数与解构

特殊另类”数组”

  • 多维数组: 嵌套
  • 对象数组: JSON…
  • “类”数组: DOM 元素…

“类”数组和普通数组区别,虽然表面很像,但其实内部不像。
类和数组区别

示例代码笔记:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>另类数组</title>
  8. </head>
  9. <body>
  10. <script>
  11. // 1. 多维数组: 成员仍然是数组
  12. // 一维数组
  13. let staff = [1, 'Jack', 5000]
  14. console.log(staff)
  15. // 二维数组
  16. let staffs = [
  17. [1, 'Jack', 5000],
  18. [2, 'Tony', 6000],
  19. [1, 'John', 7000],
  20. ]
  21. console.log(staffs)
  22. console.log(staffs[1][1])
  23. // ------------------------------
  24. // 2. 对象数组: 成员是对象, JSON
  25. staffs = [
  26. { id: 1, name: 'Jack', salary: 5000 },
  27. { id: 2, name: 'Tony', salary: 6000 },
  28. { id: 1, name: 'John', salary: 7000 },
  29. ]
  30. console.log(staffs)
  31. console.log(staffs[2]['name'])
  32. console.log(staffs[2].name)
  33. // ------------------------------
  34. // 3. "类"数组: 不是数组,是对象,但长得像"数组"
  35. let user = [5, 'admin', 'admin@qq.com']
  36. console.log(user)
  37. console.log(Array.isArray(user))
  38. // 类数组: 对象
  39. user = { 0: 5, 1: 'admin', 2: 'admin@qq.com', length: 3 }
  40. console.log(user)
  41. console.log(Array.isArray(user))
  42. console.log(typeof user)
  43. // DOM: html元素的集合,就是一个"类"数组,对象集合的方法是受限的,没有数组多
  44. // 为了使用数组中的定义的超多的超好用的方法, 所以有必要将类数组转为真正的数组
  45. // "类"数组 => "真"数组
  46. const arr = Array.from(user)
  47. // 验证
  48. console.log(Array.isArray(arr))
  49. /**
  50. * 1. 多维数组(二维)
  51. * 2. 对象数组
  52. * 3. "类"数组
  53. */
  54. </script>
  55. </body>
  56. </html>

作用域

  • 作用域: 用来查询变量
  • 作用域链: 查询变量的路径(由内向外不可逆)
  • 类型: 块, 函数, 全局, 模块

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>作用域/作用域链</title>
  8. </head>
  9. <body>
  10. <script>
  11. // 1. 块作用域
  12. {
  13. let age = 20
  14. console.log(age)
  15. }
  16. // 块外部不可见
  17. // console.log(age)
  18. // -------------------------
  19. // 2. 函数作用域
  20. function show() {
  21. // 私有成员
  22. let uname = 'Robin'
  23. console.log(uname)
  24. }
  25. show()
  26. // 函数外部不可见
  27. // console.log(uname)
  28. // -------------------------
  29. // 3. 全局作用域
  30. // 声明在"块,函数"之外的成员, 都是在全局作用域中,且全局可见
  31. // 全局变量
  32. const uname = '余老师'
  33. // 块
  34. {
  35. console.log(uname)
  36. }
  37. // 函数
  38. ; (function () {
  39. console.log(uname)
  40. })()
  41. // -------------------------
  42. // 4. 作用域链
  43. let a = 400
  44. {
  45. // let a = 300
  46. {
  47. // let a = 200
  48. {
  49. // let a = 100
  50. console.log(a)
  51. }
  52. }
  53. }
  54. </script>
  55. </body>
  56. </html>

对象简化

  • 属性简写: 属性名与变量同名,则只写属性即可
  • 方法简写: 删除: function
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>对象字面量的简化</title>
  8. </head>
  9. <body>
  10. <script>
  11. // ES6中的class只支持简化的对象字面量语法
  12. let user = {
  13. // 属性
  14. uname: '余老师',
  15. // 方法
  16. greet: function () {
  17. return `Hello, ${this.uname}`
  18. },
  19. }
  20. console.log(user.greet());
  21. // --------------------
  22. // 1. 属性简化
  23. let uname = '余老师'
  24. user = {
  25. // 属性值如果来自同一个作用域中的变量,这时可以只写属性名
  26. // uname: uname,
  27. // 属性与变量同名,只写属性,不写变量
  28. uname,
  29. }
  30. console.log(user.uname)
  31. // --------------------
  32. user = {
  33. uname,
  34. // greet: function () {
  35. // return `Hello, ${this.uname}`
  36. // },
  37. // 方法简化: 删除 ": function"
  38. greet() {
  39. return `Hello, ${this.uname}`
  40. },
  41. }
  42. console.log(user.greet())
  43. // 最终的简化结果
  44. user = {
  45. uname,
  46. greet() {
  47. return `Hello, ${this.uname}`
  48. },
  49. }
  50. console.log(user.greet())
  51. // 思考?能不能用箭头函数来简化方法的编写
  52. user = {
  53. uname,
  54. // 箭头函数没有自己this
  55. // this !== user
  56. greet: () => {
  57. // this === window !== user
  58. console.log(this)
  59. return `Hello, ${this.uname}`
  60. },
  61. }
  62. console.log(user.greet())
  63. // 注: 对象字面量中不能用箭头函数,除非你的方法中不使用 this
  64. </script>
  65. </body>
  66. </html>

分支

  • 单分支: if(){}
  • 双分支: if(){}else{}
  • 多分支: if(){}else if(){}else{}
  • 双分支语法糖: con ? true : false
  • 多分支语法糖: switch(离散,区间)
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>分支</title>
  8. </head>
  9. <body>
  10. <script>
  11. // 1. 单分支
  12. let status = true
  13. if (status) {
  14. console.log('Success')
  15. }
  16. // ---------------------------
  17. // 2. 双分支
  18. // 添加了"默认分支": else
  19. status = false
  20. if (status) {
  21. console.log('Success')
  22. } else {
  23. console.log('Fail')
  24. }
  25. // 双分支有一个语法糖来简化: 三元运算
  26. status = true
  27. console.log(status ? 'Success' : 'Fail')
  28. // ---------------------------
  29. // 3. 多分支
  30. let age = 20
  31. age = 80
  32. age = 13
  33. if (age >= 18 && age < 60) {
  34. console.log('请放心观看')
  35. } else if (age >= 60) {
  36. console.log('请在子女陪同下观看')
  37. } else {
  38. // < 18
  39. console.log('未成年,好好学习')
  40. }
  41. // 多分支语法糖: switch
  42. age = 73
  43. switch (true) {
  44. case age >= 18 && age < 60:
  45. console.log('请放心观看')
  46. break
  47. case age >= 60:
  48. console.log('请在子女陪同下观看')
  49. break
  50. default:
  51. console.log('未成年,好好学习')
  52. }
  53. </script>
  54. </body>
  55. </html>

循环

  • while()
  1. let arr = ['red', 'green', 'blue']
  2. // 1. 初始化: 从哪里开始,入口,从索引0开始
  3. let i = 0
  4. // 2. 条件
  5. console.log(arr.length)
  6. while (i < arr.length) {
  7. console.log(arr[i])
  8. // 3. 更新条件
  9. // i = i + 1
  10. // i += 1
  11. i++
  12. }
  • for() while的简化(语法糖)
  1. let arr = ['red', 'green', 'blue']
  2. for (let i = 0; i < arr.length; i++) {
  3. console.log(arr[i])
  4. }
  • for-of 遍历”数组”,只关注值
  1. let arr = ['red', 'green', 'blue']
  2. for (let value of arr) {
  3. // value: 循环变量,用来接收每一次遍历的数组成员
  4. console.log(value)
  5. }
  • for-in 遍历”对象”

key就是键值

  1. const user = { id: 5, uname: 'Tony', salary: 6000 }
  2. for (let key in user) {
  3. // 不能用"点"语法来访问对象成员,必须用[]
  4. console.log(user[key])
  5. }
  • forEach() 遍历”数组”
  1. let arr = ['red', 'green', 'blue']
  2. // 语法 : forEach(function(值,该值的索引?,正在遍历的当前数组?){})
  3. arr.forEach(function (item, index, arr) {
  4. console.log(item, index, arr)
  5. })
  6. // 只有第一个参数是必选的,后面二个是可选的
  7. arr.forEach(function (item) {
  8. console.log(item)
  9. })
  10. // 参数是回调参数,也是一个匿名函数,通常可以用箭头函数来简化
  11. arr.forEach(item => console.log(item))
  • map() 遍历数组

  1. // map 与 forEach 使用方法一样,只不过有一个返回值
  2. arr = [1, 2, 3]
  3. let res = arr.map(item => item * 2)
  4. console.log(res)
  5. // 任务: 生成一组列表,<ul>,渲染(显示)到页面中
  6. arr = ['笔记本电脑', '智能手机', '微单相机']
  7. arr = arr.map(item => `<li><a href="">${item}</a></li>`)
  8. console.log(arr)
  9. // 数组 => 字符串
  10. console.log([10, 20, 30].join())
  11. console.log([10, 20, 30].join(''))
  12. res = arr.join('')
  13. console.log(res)
  14. res = '<ul>' + res + '</ul>'
  15. console.log(res)
  16. // DOM: 渲染到页面上(后面会细说,先忽略)
  17. document.body.insertAdjacentHTML('afterbegin', res)

完整的代码示例:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>循环</title>
  8. </head>
  9. <body>
  10. <script>
  11. // 循环: 集合类型( 数组, 对象 )
  12. /**
  13. * 循环三要素
  14. * 1. 初始化: 从哪里开始,入口
  15. * 2. 条件: 到哪里结束,true继续,false停止
  16. * 3. 更新条件: 避免死循环
  17. */
  18. let arr = ['red', 'green', 'blue']
  19. console.log(arr)
  20. // 1. while
  21. // 1. 初始化: 从哪里开始,入口,从索引0开始
  22. let i = 0
  23. // 2. 条件
  24. console.log(arr.length)
  25. while (i < arr.length) {
  26. console.log(arr[i])
  27. // 3. 更新条件
  28. // i = i + 1
  29. // i += 1
  30. i++
  31. }
  32. // -------------------------------
  33. // 2. for : while的简化(语法糖)
  34. for (let i = 0; i < arr.length; i++) {
  35. console.log(arr[i])
  36. }
  37. // -------------------------------
  38. // 3. for-of: 遍历"数组",只关注值
  39. for (let value of arr) {
  40. // value: 循环变量,用来接收每一次遍历的数组成员
  41. console.log(value)
  42. }
  43. // -------------------------------
  44. // 4. for-in: 遍历"对象"
  45. const user = { id: 5, uname: 'Tony', salary: 6000 }
  46. for (let key in user) {
  47. // 不能用"点"语法来访问对象成员,必须用[]
  48. console.log(user[key])
  49. }
  50. // -------------------------------
  51. // 5. forEach: 遍历"数组"
  52. // 语法 : forEach(function(值,该值的索引?,正在遍历的当前数组?){})
  53. arr.forEach(function (item, index, arr) {
  54. console.log(item, index, arr)
  55. })
  56. // 只有第一个参数是必选的,后面二个是可选的
  57. arr.forEach(function (item) {
  58. console.log(item)
  59. })
  60. // 参数是回调参数,也是一个匿名函数,通常可以用箭头函数来简化
  61. arr.forEach(item => console.log(item))
  62. // -------------------------------
  63. // 6. map: 遍历数组
  64. // map 与 forEach 使用方法一样,只不过有一个返回值
  65. arr = [1, 2, 3]
  66. let res = arr.map(item => item * 2)
  67. console.log(res)
  68. // 任务: 生成一组列表,<ul>,渲染(显示)到页面中
  69. arr = ['笔记本电脑', '智能手机', '微单相机']
  70. arr = arr.map(item => `<li><a href="">${item}</a></li>`)
  71. console.log(arr)
  72. // 数组 => 字符串
  73. console.log([10, 20, 30].join())
  74. console.log([10, 20, 30].join(''))
  75. res = arr.join('')
  76. console.log(res)
  77. res = '<ul>' + res + '</ul>'
  78. console.log(res)
  79. // DOM: 渲染到页面上(后面会细说,先忽略)
  80. document.body.insertAdjacentHTML('afterbegin', res)
  81. </script>
  82. </body>
  83. </html>

函数参数与返回值

参数:

  • 参数不足: 默认参数
  • 参数过多: 剩余参数

返回值:

  • 单值: return
  • 多值: 数组,对象
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>函数参数与返回值</title>
  8. </head>
  9. <body>
  10. <script>
  11. // 函数参数与返回值
  12. let sum = (a, b) => `${a} + ${b} = ${a + b}`;
  13. console.log(sum(1, 2));
  14. // 1. 参数
  15. // 参数不足: 默认参数
  16. console.log(sum(3));
  17. sum = (a, b = 0) => `${a} + ${b} = ${a + b}`;
  18. console.log(sum(3));
  19. // 参数过多: 剩余参数(...数组)
  20. console.log(sum(4, 5, 6));
  21. // 第3个参数6: 丢失了
  22. // 剩余参数: ...arr, 将参数全部压入到一个数组中
  23. sum = (...arr) => arr;
  24. console.log(sum(4, 5, 6, 7, 8));
  25. sum = (a, b, ...arr) => console.log(a, b, arr);
  26. sum(4, 5, 6, 7, 8);
  27. // 将压入数组的参数全部展开: ... 不是用在参数列表中,就是展开/释放
  28. sum = (a, b, ...arr) => console.log(a, b, ...arr);
  29. sum(4, 5, 6, 7, 8);
  30. //求和
  31. sum = (...arr) => {
  32. // 累加器
  33. let acc = 0;
  34. // 累加操作
  35. for (let i = 0; i < arr.length; i++) {
  36. acc += arr[i];
  37. }
  38. // 结果返回
  39. return acc;
  40. };
  41. console.log(sum(4, 5, 6, 7, 8));
  42. // 数组求和有现成的函数 reduce
  43. sum = (...arr) => arr.reduce((acc, pre) => acc + pre);
  44. console.log(sum(4, 5, 6, 7, 8));
  45. // -----------------------
  46. // 2. 返回值
  47. // 函数都是"单值返回"
  48. // 多值怎么办? 返回一个集合(数组,对象)
  49. // 返回数组
  50. let fn = () => [100, 200, 300];
  51. console.log(fn());
  52. // 返回对象
  53. // 对象与代码块都是用 " { ... }",加上 " ()" 转为表达式
  54. fn = () => ({ id: 1, uname: "admin" });
  55. console.log(fn());
  56. </script>
  57. </body>
  58. </html>

模板字面量

  • 多行字符串
  • 变量解析

第一篇有提到,可以前往学习:JavaScript编程基础(一)

解构赋值

  • 数组解构: []=[]
  • 对象解构: {}={}
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>解构赋值</title>
  8. </head>
  9. <body>
  10. <script>
  11. /**
  12. * 解构赋值: 数组,对象等集合类型
  13. * 解构: 将集合中每个成员, 赋值给独立的变量
  14. * 语法: 模板 = 数据
  15. * 1. 数组: [...] = [...]
  16. * 2. 对象: {...} = {...}
  17. */
  18. // 1. 数组解构
  19. const user = ["admin", "admin@qq.com"];
  20. // 传统
  21. // let uname = user[0]
  22. // let email = user[1]
  23. // console.log(uname, email)
  24. let [uname, email] = ["admin", "admin@qq.com"];
  25. console.log(uname, email);
  26. // 更新, [],(),{}前的分号不能省
  27. [uname, email] = ["Tony", "tony@qq.com"];
  28. console.log(uname, email);
  29. // 变量不足:默认值
  30. [uname, email, age = 30] = ["Tony", "tony@qq.com"];
  31. console.log(uname, email, age);
  32. // 数据过多: 剩余参数 '...'
  33. [uname, email, ...arr] = ["Tony", "tony@qq.com", 40, 6000];
  34. console.log(uname, email, arr);
  35. console.log(uname, email, ...arr);
  36. // -------------------------------
  37. // 2. 对象解构
  38. // 默认: 对象的属性,就是变量名
  39. // 变量名 === 属性名
  40. let { id, username } = { id: 1, username: "余老师" };
  41. console.log(id, username);
  42. // 起别名, 隐藏原始变量名;
  43. let { id: uid, username: myName } = { id: 3, username: "余同志" };
  44. console.log(uid, myName);
  45. // ------------------------------
  46. // 3. 应用场景
  47. /**
  48. * 1. 克隆
  49. * 2. 传参
  50. */
  51. // 1. 克隆对象
  52. let item = { name: "手机", price: 6000 };
  53. let { ...obj } = item;
  54. // obj 就是由 item 克隆而来的复制品, 并不是同一个
  55. console.log(obj);
  56. console.log(item);
  57. console.log(item === obj);
  58. // 2. 解构传参
  59. let show = function (item) {
  60. // item是object
  61. return `${item.name}: ${item.price} 元`;
  62. };
  63. console.log(show({ name: "电脑", price: 8000 }));
  64. // 对象解构传参
  65. // show = function ({ name, price }) {
  66. // return `${name}: ${price} 元`
  67. // }
  68. // 可以继续简化,使用箭头函数
  69. show = ({ name, price }) => `${name}: ${price} 元`;
  70. console.log(show({ name: "相机", price: 28000 }));
  71. </script>
  72. </body>
  73. </html>
本文地址:https://www.mainblog.cn/327.html
版权声明:本文为原创文章,版权归 阁主 所有,欢迎分享本文,转载请保留出处!
免责申明:有些内容源于网络,没能联系到作者。如侵犯到你的权益请告知,我们会尽快删除相关内容。

评论已关闭!