JavaScript之ES6高级语法(四)

news2024/11/18 3:32:31

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。

ES6高级语法(四)

  • 前言
  • 一、深浅拷贝
    • 1.1、浅拷贝
    • 1.2、深拷贝
      • 1.2.1、递归实现深拷贝
      • 1.2.2、js库lodash里面cloneDeep内部实现了深拷贝
      • 1.2.3、JSON序列化
  • 二、异常处理
    • 2.1、throw
    • 2.2、try ... catch
    • 2.3、debugger
  • 三、this
    • 3.1、普通函数
    • 3.2、箭头函数
  • 四、改变this指向:call、apply、bind
    • 4.1、call
    • 4.2、apply
    • 4.3、bind
  • 五、防抖节流
    • 5.1、通过lodash工具库来实现节流防抖
    • 5.2手写节流
    • 5.3、手写防抖
    • 5.4、节流防抖使用场景


前言

今天学习的主要是关于ES6知识的理解和应用


一、深浅拷贝

首先浅拷贝和深拷贝只针对引用类型

1.1、浅拷贝

浅拷贝:拷贝的是地址

常见方法:

  1. 拷贝对象:Object.assgin() / 展开运算符 {…obj} 拷贝对象
  2. 拷贝数组:Array.prototype.concat() 或者 […arr]

如果是简单数据类型拷贝,引用数据类型拷贝的是地址 (简单理解: 如果是单层对象,没问题,如果有多层就有问题,因为多层的数组或对象不能拷贝到值,只能拷贝地址,所以改变拷贝的对象或数组的值原对象或数组的值也会改变,因为它们的地址指向同一个值)

1.2、深拷贝

首先浅拷贝和深拷贝只针对引用类型

深拷贝:拷贝的是对象,不是地址

常见方法:

  1. 通过递归实现深拷贝
  2. lodash/cloneDeep
  3. 通过JSON.stringify()实现

1.2.1、递归实现深拷贝

函数递归:
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数

  • 简单理解:函数内部自己调用自己, 这个函数就是递归函数
  • 递归函数的作用和循环效果类似
  • 由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件 return
 <script>
    const obj = {
      uname: 'pink',
      age: 18,
      hobby: ['乒乓球', '足球'],
      family: {
        baby: '小pink'
      }
    }
    const o = {}
    // 拷贝函数
    function deepCopy(newObj, oldObj) {
      debugger
      for (let k in oldObj) {
        // 处理数组的问题  一定先写数组 在写 对象 不能颠倒
        if (oldObj[k] instanceof Array) {
          newObj[k] = []
          //  newObj[k] 接收 []  hobby
          //  oldObj[k]   ['乒乓球', '足球']
          deepCopy(newObj[k], oldObj[k])
        } else if (oldObj[k] instanceof Object) {
          newObj[k] = {}
          deepCopy(newObj[k], oldObj[k])
        }
        else {
          //  k  属性名 uname age    oldObj[k]  属性值  18
          // newObj[k]  === o.uname  给新对象添加属性
          newObj[k] = oldObj[k]
        }
      }
    }
    deepCopy(o, obj) // 函数调用  两个参数 o 新对象  obj 旧对象
    console.log(o)
    o.age = 20
    o.hobby[0] = '篮球'
    o.family.baby = '老pink'
    console.log(obj)
    console.log([1, 23] instanceof Object)
    // 复习
    // const obj = {
    //   uname: 'pink',
    //   age: 18,
    //   hobby: ['乒乓球', '足球']
    // }
    // function deepCopy({ }, oldObj) {
    //   // k 属性名  oldObj[k] 属性值
    //   for (let k in oldObj) {
    //     // 处理数组的问题   k 变量
    //     newObj[k] = oldObj[k]
    //     // o.uname = 'pink'
    //     // newObj.k  = 'pink'
    //   }
    // }
  </script>

1.2.2、js库lodash里面cloneDeep内部实现了深拷贝

要先自己提前去lodash下载lodash.min.js文件,也可以使用npm命令下载

 <!-- 先引用 -->
  <script src="./lodash.min.js"></script>
  <script>
    const obj = {
      uname: 'pink',
      age: 18,
      hobby: ['乒乓球', '足球'],
      family: {
        baby: '小pink'
      }
    }
    const o = _.cloneDeep(obj)
    console.log(o)
    o.family.baby = '老pink'
    console.log(obj)
  </script>

1.2.3、JSON序列化

const o = JSON.parse(JSON.stringify(obj))
这里是通过JSON.stringify(obj)把对象转为字符串,然后再通过JSON.parse()将其转为对象(这个对象是新建的,所以这个对象和原来的对象不一样,所以这样就实现了对象的深拷贝)

 <script>
    const obj = {
      uname: 'pink',
      age: 18,
      hobby: ['乒乓球', '足球'],
      family: {
        baby: '小pink'
      }
    }
    // 把对象转换为 JSON 字符串
    // console.log(JSON.stringify(obj))
    const o = JSON.parse(JSON.stringify(obj))
    console.log(o)
    o.family.baby = '123'
    console.log(obj)
  </script>

二、异常处理

2.1、throw

异常处理是指预估代码执行过程中可能发生的错误,然后最大程度的避免错误的发生导致整个程序无法继续运行。

总结:

  1. throw 抛出异常信息,程序也会终止执行
  2. throw 后面跟的是错误提示信息
  3. Error 对象配合 throw 使用,能够设置更详细的错误信息
<script>
  function counter(x, y) {

    if(!x || !y) {
      // throw '参数不能为空!';
      throw new Error('参数不能为空!')
    }

    return x + y
  }

  counter()
</script>

2.2、try … catch

总结:

  1. try...catch 用于捕获错误信息
  2. 将预估可能发生错误的代码写在 try 代码段中
  3. 如果 try 代码段中出现错误后,会执行 catch 代码段,并截获到错误信息
<script>
   function foo() {
      try {
        // 查找 DOM 节点
        const p = document.querySelector('.p')
        p.style.color = 'red'
      } catch (error) {
        // try 代码段中执行有错误时,会执行 catch 代码段
        // 查看错误信息
        console.log(error.message)
        // 终止代码继续执行
        return

      }
      finally {
          alert('执行')
      }
      console.log('如果出现错误,我的语句不会执行')
    }
    foo()
</script>

2.3、debugger

相当于断点调试

三、this

了解函数中 this 在不同场景下的默认值,知道动态指定函数 this 值的方法。

概述:
this 是 JavaScript 最具“魅惑”的知识点,不同的应用场合 this 的取值可能会有意想不到的结果,在此我们对以往学习过的关于【 this 默认的取值】情况进行归纳和总结。

3.1、普通函数

普通函数的调用方式决定了 this 的值,即【谁调用 this 的值指向谁】,如下代码所示:

<script>
  // 普通函数
  function sayHi() {
    console.log(this)  
  }
  // 函数表达式
  const sayHello = function () {
    console.log(this)
  }
  // 函数的调用方式决定了 this 的值
  sayHi() // window
  window.sayHi()
	

// 普通对象
  const user = {
    name: '小明',
    walk: function () {
      console.log(this)
    }
  }
  // 动态为 user 添加方法
  user.sayHi = sayHi
  uesr.sayHello = sayHello
  // 函数调用方式,决定了 this 的值
  user.sayHi()
  user.sayHello()
</script>

注: 普通函数没有明确调用者时 this 值为 window,严格模式下没有调用者时 this 的值为 undefined

3.2、箭头函数

箭头函数中的 this 与普通函数完全不同,也不受调用方式的影响,事实上箭头函数中并不存在 this !箭头函数中访问的 this 不过是箭头函数所在作用域的 this 变量。

<script>
    
  console.log(this) // 此处为 window
  // 箭头函数
  const sayHi = function() {
    console.log(this) // 该箭头函数中的 this 为函数声明环境中 this 一致
  }
  // 普通对象
  const user = {
    name: '小明',
    // 该箭头函数中的 this 为函数声明环境中 this 一致
    walk: () => {
      console.log(this)
    },
    
    sleep: function () {
      let str = 'hello'
      console.log(this)
      let fn = () => {
        console.log(str)
        console.log(this) // 该箭头函数中的 this 与 sleep 中的 this 一致
      }
      // 调用箭头函数
      fn();
    }
  }

  // 动态添加方法
  user.sayHi = sayHi
  
  // 函数调用
  user.sayHi()
  user.sleep()
  user.walk()
</script>

在开发中【使用箭头函数前需要考虑函数中 this 的值】,事件回调函数使用箭头函数时,this 为全局的 window,因此DOM事件回调函数不推荐使用箭头函数,如下代码所示:

<script>
  // DOM 节点
  const btn = document.querySelector('.btn')
  // 箭头函数 此时 this 指向了 window
  btn.addEventListener('click', () => {
    console.log(this)
  })
  // 普通函数 此时 this 指向了 DOM 对象
  btn.addEventListener('click', function () {
    console.log(this)
  })
</script>

同样由于箭头函数 this 的原因,基于原型的面向对象也不推荐采用箭头函数,如下代码所示:

<script>
  function Person() {
  }
  // 原型对像上添加了箭头函数
  Person.prototype.walk = () => {
    console.log('人都要走路...')
    console.log(this); // window
  }
  const p1 = new Person()
  p1.walk()
</script>

四、改变this指向:call、apply、bind

以上归纳了普通函数和箭头函数中关于 this 默认值的情形,不仅如此 JavaScript 中还允许指定函数中 this 的指向,有 3 个方法可以动态指定普通函数中 this 的指向

三者中,call和apply的区别是传递参数不一样,call是数字,apply是数组,所以apply可以用来求数组的最大值、最小值:
使用场景: 求数组最大值
const arr = [100, 44, 77]
const max = Math.max.apply(Math, arr)
const min = Math.min.apply(null, arr)
而bind和call几乎一样,传递的参数也一样,只是bind它不会立即执行,它只改变this的指向,而call和apply它们再改变this的同时还会立即调用这个方法

4.1、call

使用 call 方法调用函数,同时指定函数中 this 的值,使用方法如下代码所示:

<script>
  // 普通函数
  function sayHi() {
    console.log(this);
  }

  let user = {
    name: '小明',
    age: 18
  }

  let student = {
    name: '小红',
    age: 16
  }

  // 调用函数并指定 this 的值
  sayHi.call(user); // this 值为 user
  sayHi.call(student); // this 值为 student

  // 求和函数
  function counter(x, y) {
    return x + y;
  }

  // 调用 counter 函数,并传入参数
  let result = counter.call(null, 5, 10);
  console.log(result);
</script>

总结:

  1. call 方法能够在调用函数的同时指定 this 的值
  2. 使用 call 方法调用函数时,第1个参数为 this 指定的值
  3. call 方法的其余参数会依次自动传入函数做为函数的参数

4.2、apply

使用 call 方法调用函数,同时指定函数中 this 的值,使用方法如下代码所示:

<script>
  // 普通函数
  function sayHi() {
    console.log(this)
  }

  let user = {
    name: '小明',
    age: 18
  }

  let student = {
    name: '小红',
    age: 16
  }

  // 调用函数并指定 this 的值
  sayHi.apply(user) // this 值为 user
  sayHi.apply(student) // this 值为 student

  // 求和函数
  function counter(x, y) {
    return x + y
  }
  // 调用 counter 函数,并传入参数
  let result = counter.apply(null, [5, 10])
  console.log(result)

 const obj = {
      age: 18
    }
    function fn(x, y) {
      console.log(this) // {age: 18}
      console.log(x + y)
    }
    // 1. 调用函数
    // 2. 改变this指向 
    //  fn.apply(this指向谁, 数组参数)
    fn.apply(obj, [1, 2])
    // 3. 返回值   本身就是在调用函数,所以返回值就是函数的返回值

    // 使用场景: 求数组最大值
    // const max = Math.max(1, 2, 3)
    // console.log(max)
    const arr = [100, 44, 77]
    const max = Math.max.apply(Math, arr)
    const min = Math.min.apply(null, arr)
    console.log(max, min)
    // 使用场景: 求数组最大值
    console.log(Math.max(...arr))
</script>

总结:

  1. apply 方法能够在调用函数的同时指定 this 的值
  2. 使用 apply 方法调用函数时,第1个参数为 this 指定的值
  3. apply 方法第2个参数为数组,数组的单元值依次自动传入函数做为函数的参数

4.3、bind

bind 方法并不会调用函数,而是创建一个指定了 this 值的新函数,使用方法如下代码所示:

<script>
  // 普通函数
  function sayHi() {
    console.log(this)
  }
  let user = {
    name: '小明',
    age: 18
  }
  // 调用 bind 指定 this 的值
  let sayHello = sayHi.bind(user);
  // 调用使用 bind 创建的新函数
  sayHello()
</script>

注:bind 方法创建新的函数,与原函数的唯一的变化是改变了 this 的值。

五、防抖节流

节流防抖的底层就是通过定时器来实现的

  1. 防抖(debounce)
    所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间
  2. 节流(throttle)
    所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数

5.1、通过lodash工具库来实现节流防抖

在这里插入图片描述
在这里插入图片描述
具体代码如下:

<script>
    const box = document.querySelector('.box')
    let i = 1  // 让这个变量++
    // 鼠标移动函数
    function mouseMove() {
      box.innerHTML = ++i
      // 如果里面存在大量操作 dom 的情况,可能会卡顿
    }

    // box.addEventListener('mousemove', mouseMove)
    // lodash 节流写法
    // box.addEventListener('mousemove', _.throttle(mouseMove, 500))
    // lodash 防抖的写法
    box.addEventListener('mousemove', _.debounce(mouseMove, 500))

  </script>

5.2手写节流

要求: 鼠标在盒子上移动,里面的数字就会变化+1
利用节流的方式, 鼠标经过,500ms ,数字才显示
核心思路:
利用时间相减:移动后的时间 - 刚开始移动的时间 >= 500ms 我才去执行 mouseMove函数
①: 写一个节流函数throttle ,来控制这个操作函数(mouseMove), 500ms之后才去执行这个函数
②: 节流函数传递2个参数, 第一个参数 mouseMove函数,第二个参数 指定时间500ms
③: 鼠标移动事件,里面写的是节流函数
④: 声明一个起始时间 startTime = 0
⑤: 但是节流函数因为里面写的函数名 throttle(mouseMove, 500), 是调用函数,无法再次调用执行
,所以需要在节流函数里面写return 函数 这样可以多次执行
⑥:记录当前时间 now = Date.now()
⑦:进行判断 如果大于等于 500ms,则执行函数, 但是千万不要忘记 让 起始时间 = 现在时间
在这里插入图片描述
具体代码如下:

<script>
    const box = document.querySelector('.box')
    let i = 1  // 让这个变量++
    // 鼠标移动函数
    function mouseMove() {
      box.innerHTML = ++i
      // 如果里面存在大量操作 dom 的情况,可能会卡顿
    }
    // console.log(mouseMove)
    // 节流函数 throttle 
    function throttle(fn, t) {
      // 起始时间
      let startTime = 0
      return function () {
        // 得到当前的时间
        let now = Date.now()
        // 判断如果大于等于 500 采取调用函数
        if (now - startTime >= t) {
          // 调用函数
          fn()
          // 起始的时间 = 现在的时间   写在调用函数的下面 
          startTime = now
        }
      }
    }
    box.addEventListener('mousemove', throttle(mouseMove, 500))

    // throttle(mouseMove, 500) === function () { console.log(1) }


    // box.addEventListener('mousemove', function () {
    //   // 得到当前的时间
    //   let now = Date.now()
    //   // 判断如果大于等于 500 采取调用函数
    //   if (now - startTime >= t) {
    //     // 调用函数
    //     fn()
    //     // 起始的时间 = 现在的时间   写在调用函数的下面
    //     startTime = now
    //   }
    // })

  </script>

5.3、手写防抖

要求: 鼠标在盒子上移动,鼠标停止之后,500ms后里面的数字就会变化+1
利用防抖的方式实现,核心思路:
利用定时器实现,当鼠标滑过,判断有没有定时器,还有就清除,以最后一次滑动为准开启定时器
①: 写一个防抖函数debounce ,来控制这个操作函数(mouseMove)
②: 防抖函数传递2个参数, 第一个参数 mouseMove函数,第二个参数 指定时间500ms
③: 鼠标移动事件,里面写的是防抖函数
④: 声明定时器变量 timeId
⑤: 但是节流函数因为里面写的函数名 debounce(mouseMove, 500), 是调用函数,无法再次调用执行,
所以需要在节流函数里面写return 函数 这样可以多次执行
⑥: 如果有定时器,则清除定时器
⑦: 否则开启定时器, 在设定时间内,调用函数
在这里插入图片描述
具体代码如下:

<script>
    const box = document.querySelector('.box')
    let i = 1  // 让这个变量++
    // 鼠标移动函数
    function mouseMove() {
      box.innerHTML = ++i
      // 如果里面存在大量操作 dom 的情况,可能会卡顿
    }
    // 防抖函数
    function debounce(fn, t) {
      let timeId
      return function () {
        // 如果有定时器就清除
        if (timeId) clearTimeout(timeId)
        // 开启定时器 200
        timeId = setTimeout(function () {
          fn()
        }, t)
      }
    }
    // box.addEventListener('mousemove', mouseMove)
    box.addEventListener('mousemove', debounce(mouseMove, 200))

  </script>

5.4、节流防抖使用场景

节流:
鼠标移动,页面尺寸发生变化,滚动条滚动等开销比较
大的情况下
防抖:
搜索框输入,设定每次输入完毕n秒后发送请求,如果期
间还有输入,则从新计算时间

💕 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{orange}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

收藏,你的青睐是我努力的方向! \textcolor{red}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

🥕 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/654490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你们软件测试面试最难的一道题是什么?

在测试面试时&#xff0c;面试官往往会出一个简单的场景让大家进行测试点设计来考察大家的测试设计能力&#xff0c;题目看似简单实则蕴藏杀机&#xff0c;测试人员需要根据自己的工作年限做出不同的回答方可过关。 如果你工作1-2年&#xff0c;那么你只需要回答功能方面的测试…

源来Intel——开放原子全球峰会

文章目录 Intel的开源之路AI领域边缘人工智能在中国的发展趋势边缘人工智能领域的挑战生态系统解决方案英特尔针对边缘人工智能的产品总结 英特尔基础软件赋能中国生态Intel : 软件优先 推动中国市场中国Linux操作系统生态Intel全力投入中国开源社区开发国产Linux厂商&#xff…

I2C中的时钟同步与仲裁

时钟同步和仲裁 在单主设备中&#xff0c;不需要时钟同步和仲裁。而在多设备时&#xff0c;多个主设备可以同时在空闲的总线上开始发送数据&#xff0c;这时就需要仲裁决定哪一个来控制总线并完成它的数据传输&#xff0c;有时候也需要时钟同步来协同设备间的工作。而这正是通过…

Android音视频开发实战02-Jni

一 JNI 1.1 什么是JNI JNI是Java Native Interface的缩写&#xff0c;是Java提供的一种机制&#xff0c;用于在Java代码中调用本地&#xff08;C/C&#xff09;代码。它允许Java代码与本地代码进行交互&#xff0c;通过JNI&#xff0c;Java应用程序可以调用一些原生库或者操作…

Maven编译常见问题收集

1、父pom里面有引入lombok依赖&#xff0c;为什么子pom有用到lombok&#xff0c;依然识别不到呢 这是因为父pom引入依赖的时候&#xff0c;把 <dependency></dependency>依赖标签&#xff0c;最外层包 在了<dependencyManagement></dependencyManagemen…

Python学了基本语法 下一步该干什么 ?

刚入门Python,学习了基本语法后&#xff0c;你可以开始编写简单的程序了。接下来&#xff0c;你可以学习Python的标准库和第三方库&#xff0c;掌握更多的编程技巧和知识&#xff0c;提高自己的编程能力。同时&#xff0c;也可以通过实践项目来巩固所学知识&#xff0c;提高自己…

web3描述以太坊与区块链之间的操作关系

好通过前面两篇文章 Web3.0概念 web3带大家简单建立区块链概念 大家开始明白 web3.0是基于区块链为基础开发的 我们讲区块链多次提到以太坊 EVM 那这个东西到底是什么呢&#xff1f; 就现在的情况来讲 从零到一去搭建一个区块链环境 那可太难了 所以 以太坊一开始 确实是做一…

关于GPT-3和GPT-4,你需要知道都在这里

友情提示 提示&#xff1a;本文约3500个文字&#xff0c;字数较长&#xff0c;可直接点击序号进入相关目录阅读字数 文章目录 友情提示前言一、什么是 GPT-3、GPT-4 和 ChatGPT&#xff1f;二、对未来的担忧三、什么时候可以用GPT4&#xff1f;四、GPT-4用在什么地方五、GPT-4能…

json_decode返回NULL

json_decode返回NULL 最近在调用某公司的API时&#xff0c;将对方返回的数据&#xff0c;使用PHP的json_decode函数解析&#xff0c;但是返回NULL,最终排查为对方传送来的json格式有误 打印$_REQUEST&#xff0c;数据结构大致如下&#xff1a; 1 2 3 4 5 6 7 8 9 10 array (…

Android 面试延伸技术点有哪些,你能答上几个?

1、如何进行单元测试&#xff0c;如何保证 App 稳定 &#xff1f; 参考回答&#xff1a; 要测试 Android 应用程序&#xff0c;通常会创建以下类型自动单元测试 本地测试&#xff1a;只在本地机器 JVM 上运行&#xff0c;以最小化执行时间&#xff0c;这种单元测试不依赖于 An…

JavaScript之ES6高级语法(三)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 ES6高级语法(三&#xff09; 前言一、原型对象1.1、constructor 属性1.2、对象原型 二、原型继承三、原型链 前言 今天学习的…

【C++】红黑树的概念与模拟实现

红黑树的概念与模拟实现 红黑树的概念红黑树的性质红黑树节点的定义红黑树的迭代器红黑树的插入红黑树和AVL树的比较红黑树的模拟实现 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。…

计算机组成原理(0)概述

前言 没有想好到底是要怎么学习&#xff0c;看哪个视频课&#xff0c;看到1.2 计算机的基本组成1.2-a1_哔哩哔哩_bilibili 是15年录的视频读PPT课本不一样就更不想看了&#xff0c;但是CSAPP难度大&#xff08;主要是广度&#xff0c;所以可能不很适用于考试或计组的学习&…

java代码审计和安全漏洞修复

java代码审计和安全漏洞修复 本文目录 java代码审计和安全漏洞修复开源&#xff1a;奇安信代码卫士官网使用gitee服务使用 非开源&#xff1a;思客云找八哥错误类型以及修改方法1.硬编码2. 路径操作3. 路径操作 - Zip文件条目覆盖4. SQL注入5. SQL注入 - Hibernate6. XML外部实…

视频与图片检索中的多模态语义匹配模型 ——原理、启示、应用与展望

前言 三多前笔者在《万字长文漫谈视频理解》[1]一文中&#xff0c;曾经将自己对视频理解的认识进行过简单总结&#xff0c;幸而获得了朋友们的认可&#xff0c;能让读者认可是笔者最为骄傲的成就。现在看来文中观点有不少纰漏狭隘之处&#xff0c;特别是近年来多模态模型的流行…

6.5this关键字

1. 关键字&#xff1a;this 1.1 this 是什么&#xff1f; 首先。this在Java中是一个关键字&#xff0c;this 指代的是本类的引用对象 1.2 什么时候使用 this 1.2.1 实例方法或构造器中使用当前对象的成员 1、在实例方法或构造器中&#xff0c;我们在使用get和set方法中使用…

行为型设计模式06-迭代器模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 迭代器模式 1、迭代器模式介绍 迭代器模式是一种行为型设计模式&#xff0c;它提供了一种方法来访问聚…

HydroD 实用教程(九)时域水动力分析

目 录 一、前言二、前处理三、定义/提交作业3.1 创建分析作业3.2 定义输入数据3.3 设置执行指令3.4 指定输出格式3.5 提交求解计算 四、输出文件五、结果后处理5.1 绘制力/位移时程5.2 傅里叶变换与导荷5.3 播放时域结果动画 六、参考文献 一、前言 SESAM &#xff08;Super El…

扫描仪连续扫描提示有一个问题阻值扫描该文档。请重试,错误的解决办法

故障现象: 用户新安装的联想M7650DNA一体多功能激光打印机,安装完所有驱动后;打印、复印都正常,只有扫描不正常,扫描多张后就会提示:有一个问题阻值扫描该文档。请重试,或者参阅“帮助和支持”或扫描仪附带的信息,了解有关疑难解答的信息。如下图:故障。 开始怀…

基于Pytest+Allure+Excel的接口自动化测试框架

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具&#xff0c;它不仅以 Web 的方式展示了简介的测试结果&#xff0c;而且允许参与开发过程的每个人可以从日常执行的测试中&#xff0c;最大限度地提取有用信息。 Allure 是由 Java 语言开发…