【前端】前端三要素之BOM

写在前面:本文仅包含BOM内容,JavaScript传送门在这里,DOM传送门在这里。

本文内容是假期中刷的黑马Pink老师视频(十分感谢Pink老师),原文保存在个人的GitLab中,如果需要写的网页内容信息等可以评论联系我,若是编辑博文中出现了忘记上传的图片或者错位的图片欢迎评论区指正。写作不易,欢迎点赞、收藏+关注。

文章目录

  • BOM 导论
    • 什么是BOM
    • DOM 与 BOM 对比
    • 一些描述
  • 窗口加载事件
    • 使用`window.onload`来改变`script`标签的位置
    • 通过监听事件的方式写多个`load`
    • 通过`DOMContentLoaded`事件来获取窗口加载事件
  • 窗口大小变化事件
  • 回调函数
  • `setTimeout` 定时器
    • 定时器函数的使用
        • 通过匿名函数调用
        • 通过函数名调用
        • 通过函数名字符串调用 | 不推荐
        • 区分不同的定时器
    • 清除定时器
  • `setInterval()` 定时器
    • `setInterval()` 的使用
    • 清除定时器 `setInterval()`
  • this指向问题
  • `location`对象
    • `location`相关属性与方法
    • `navigator`对象获取浏览器信息
  • 历史记录
    • `forward()` 前进 与 `back()` 后退
  • 页面偏移量 offsetLeft 与 offsetTop
    • `offsetLeft` 与 `offsetTop`
    • `offsetWidth`与`offsetHeight`
    • `offsetParent`
  • `client` 系列
  • `scroll`系列
    • `scroll` 属性
    • `scroll` 方法
  • 移动端事件
  • 触摸时间对象
  • 本地存储
    • sessionStorage
    • localStorage

BOM 导论

什么是BOM

BOM(Browser Object Model)浏览器对象模型,他提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window

BOM 是由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。

BOM缺乏标准,JavaScript语法的标准化组织室ECMA,DOM的标准化组织是W3C,BOM最初是Netscape(网景公司)浏览器标准的一部分。

DOM 与 BOM 对比

DOMBOM
文档对象模型浏览器对象模型
DOM就是把「文档」当做一个「对象」来看待把「浏览器」当做是一个「对象」来看待
DOM的顶级对象是documentBOM的顶级对象是window
DOM的主要学习是操作页面元素BOM学习的事浏览器窗口交互的一些对象
DOM是W3C标准BOM是浏览器厂商在各自浏览器上定义的,兼容性较差

BOM 与 DOM 的关系

在这里插入图片描述

一些描述

  1. 我们常用的document.xxx(如document.quertSelector(),举例在下面的代码段) ,完整的写法是 window.documnt.xxx
  2. 如果我们在script中定义了一个全局变量(以num举例,如下代码),那么我们真正的调用方式其实是window.num
  3. window包含一些方法,如我们常用的alert,我们也可以在前面加上window.使用,示例如下
<body><div>我是Jim.kk</div><script>// 1. 方法调用的省略写法document.querySelector('div');// 2. 方法调用的完整写法window.document.querySelector('div');var num = 10;// 3. 全局变量的省略写法console.log(num);// 4. 全局变量的完整写法console.log(window.num);// BOM的alert方法window.alert('我是Jim.kk');</script>
</body>

窗口加载事件

使用window.onload来改变script标签的位置

window.onload,是窗口(页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、css文件等),就调用处理函数。

一般来说,我们需要按照先写标签,然后将script标签写在标签的下面的方式,但是我们可以通过window.onload来改变script标签的位置,因为这个方法会在页面加载完毕之后才执行,所以执行这个方法的时候,页面中的DOM元素已经全部被渲染了,请看下面示例。

<body><script>window.onload = function () {var btn = document.querySelector('button');btn.addEventListener('click',function () {alert('你点我?');})}</script><button>点击</button>
</body>

在以上代码中,我们没有按照之前的标准,将script标签写在button标签下面,但是依旧是可用的。

通过监听事件的方式写多个load

如果页面中存在多个window.onload,会以最后一个为准(最后一个会覆盖前面的事件)

这是传统事件存在的弊端,为了解决这一问题,我们可以使用监听事件替换window.onload,请看下面示例。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>页面加载事件|侦听</title><script>window.addEventListener('load',function () {var btn2 = document.querySelector('#btn2');btn2.onclick = function () {alert('点击了按钮2');}})</script>
</head>
<body><script>window.addEventListener('load',function () {var btn1 = document.querySelector('#btn1');btn1.onclick = function () {alert('点击了按钮1');}})</script><button id="btn1">btn1</button><button id="btn2">btn2</button>
</body>
</html>

上面代码中,我们添加了两个window的侦听事件,验证得知两个侦听事件都生效了。

通过DOMContentLoaded事件来获取窗口加载事件

document.addEventListener('DOMContentLoaded',function () {})

DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表、图片、flash等。IE9以上才支持。

若果页面的图片非常多,那么推荐使用这种方式。

<body><script>window.addEventListener('load',function () {alert(22);})document.addEventListener('DOMContentLoaded',function () {alert(33);})</script>
</body>

以上代码一定是先弹出33再弹出22的,因为DOMContentLoaded事件只需要DOM元素加载完毕就可以执行,但是load需要加载完成图片等各种信息之后才执行。

窗口大小变化事件

window.onresize = functoin(){}
window.addEventListener('resize',function () {} )

只要窗口大小发生变化,就会触发里面的处理函数。

<body><button>当宽度小于900px的时候,我就消失啦</button><script>window.addEventListener('resize',function () {// console.log('变化了');// console.log('内高:'+window.innerHeight+'\t内宽' + window.innerWidth);var btn = document.querySelector('button');if ( window.innerWidth < 900 ) {btn.style.display = 'none';} else {btn.style.display = 'block';}})</script>
</body>

以上代码的执行效果:当我们改变浏览器框的大小的时候,当宽度小于900px,这个button按钮就会消失。

这种效果常用在一些页面元素渲染上,比如原本有四个列的某种元素,但是当页面较窄的时候,我们会隐藏其中某个列,以保证页面的正常显示。

回调函数

setTimeout()这个函数我们称为回调函数 callback

普通函数是按照顺序直接调用的,但是回调函数不按顺序来,比如定时器函数需要等待时间,等其它事情干完或者到了调用条件才会调用这个函数。

之前学习的onclick函数或者element.addEventListener('xxx',fun)里面的函数也是回调函数。

setTimeout 定时器

setTimeout() 定时器

window.setTimeout(调用函数,[延迟的毫秒数]);

  1. window在调用的时候可以省略
  2. 单位是毫秒,省略是0秒,也就是立马执行
  3. 这个调用函数可以直接写函数,还可以写函数名(不需要带括号)

当延迟的毫秒数到了,就去执行函数。

定时器函数的使用

通过匿名函数调用
<body><script>// 单位是毫秒,省略是0秒,也就是立马执行setTimeout(function () {alert('我是Jim.kk');},2000);</script>
</body>

以上代码在页面加载出来两秒后会跳出弹窗提示。

通过函数名调用
<body><script>function fun() {alert('我是Jim.kk');}setTimeout(fun,2000);</script>
</body>
通过函数名字符串调用 | 不推荐

函数名字符串必须要加括号

以下代码与上面两个代码段执行无异,不多赘述

<body><script>function fun2() {alert('我是Jim.kk');}setTimeout('fun2()',2000);</script>
</body>
区分不同的定时器

以下代码会在页面加载出来后的两秒在控制台输出一句话,页面加载好的5秒后又会输出一句话。

<body><script>function fun3() {console.log('我是Jim.kk');}var timer1 = setTimeout(fun3,2000);var timer2 = setTimeout(fun3,5000);</script>
</body>

清除定时器

使用clearTimeout(定时器名称)函数可以清除定时器,请看如下代码

注意,括号内是定时器的名称,不是字符串

<body><button>点我清除定时器</button><script>var btn = document.querySelector('button');var timer1 = setTimeout(function () {alert('我是Jim.kk');},5000);btn.onclick = function () {clearTimeout(timer1);}</script>
</body>

以上代码在弹窗出现之前若是点击了按钮,弹窗则永远也不会跳出来。

setInterval() 定时器

  1. window.setInterval(回调函数,[间隔毫秒数])
  2. setTimeout()不同的是,setTimeout只会执行一次,但是setInterval会循环执行

setInterval() 的使用

<body><script>setInterval(function () {console.log('我是Jim.kk');},1000)</script>
</body>

以上代码每过一秒就会输出一次我是Jim.kk;

清除定时器 setInterval()

以下代码点击开始后开始循环(1秒1次)输出当前时间戳,点击停止后停止输出。

<body><button id="begin">开始</button><button id="stop">停止</button><script>var begin = document.querySelector('#begin');var stop = document.querySelector('#stop');var timer = null;begin.addEventListener('click',function () {setInterval(function () {console.log(+new Date());},1000);})stop.addEventListener('click',function () {clearInterval(timer);})</script>
</body>

this指向问题

总结起来一句话,谁调用,就指向谁。

  1. 全局作用下指向window
  2. 全局作用域的方法中指向window(因为是window调用的方法)
  3. 在定时器中指向window(因为定时器也是window调用的)
  4. 在对象中指向这个对象
  5. 在事件中指向被触发事件(如被点击)的元素(如按钮)
  6. 如果在按钮点击事件中调用计时器,计时器中指向的还是window
  7. 构造函数,指向的是实例对象
  1. 全局作用域下指向window
<body><script>console.log(this); // window</script>
</body>
  1. 全局作用域的方法中指向window
<body><script>function fun(){console.log(this);}fun(); // windowwindow.fun(); // 这行代码与上一行等效</script>
</body>
  1. 在定时器中指向window
<body><script>setTimeout(function () {console.log(this); // window},1000);</script>
</body>
  1. 在对象中指向这个对象
<body><script>var o = {sayHi: function () {console.log(this); // o对象}}o.sayHi(); // o 对象</script>
</body>
  1. 在事件中指向被触发事件(如被点击)的元素(如按钮)
<body><button>点我</button><script>var btn = document.querySelector('button');btn.onclick = function () {console.log(this); // <button>点我</button>}</script>
</body>
  1. 如果在按钮点击事件中调用计时器,计时器中指向的还是window
<body><button>点我</button><script>var btn = document.querySelector('button');btn.onclick = function () {setTimeout(function () {console.log(this); // 指向 window},1000)}</script>
</body>
  1. 构造函数,指向的是实例对象
<body><script>function Fun() {console.log(this); // 指向的是fun实例对象}var fun = new Fun();</script>
</body>

location对象

location相关属性与方法

window对象给我们提供了一个location属性用于获取或设置窗体的URL,并且可以用于解析URL。因为这个属性返回的是一个对象,所以我们将这个属性称为location对象

location对象属性返回值
location.href获取或者设置整个URL
location.host返回主机(域名)
location.port返回端口号,如果未写返回空字符串
location.pathname返回路径
location.search返回参数
location.hash返回片段#后面内容,常见于链接、锚点
location方法行为描述
location.assign()记录历史并跳转
location.replace()不记录历史并跳转
location.reload()重载页面,如果页面里参数是true,则强制刷新,强制刷新不会保留缓存(Ctrl+F5

可以直接在控制台输入location点回车,查看当前的location。

下面实现一个点击按钮后五秒钟倒计时跳转百度的示例

<body><button>点我跳转</button><div></div><script>var btn = document.querySelector('button');var div = document.querySelector('div');btn.onclick = function () {var timer = 5;div.innerText = '将在' + timer +'秒后跳转至百度';setInterval(function (){timer -- ;if(timer === 0){location.href = 'https://baidu.com';} else {div.innerText = '将在' + timer +'秒后跳转至百度';}},1000);}</script>
</body>

以上代码在点击按钮后,会开始执行计时器,然后div中每次显示倒计时的时间,等时间到了,就会跳转到百度。

navigator对象获取浏览器信息

navigator 对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值。

输出用户当前使用的客户端

alert(navigator.userAgent);

历史记录

forward() 前进 与 back() 后退

可以在括号中写上数字,控制前进后退的步数

要有历史记录(或者前进记录)的情况下才可以调用

以下写两个页面演示一下,命名如下:

  1. index页:``
  2. home页:_BOM_06.6-home.html
<body><a href="_BOM_07.2-home.html">前往Home页</a><button>点我下一步</button><script>var btn = document.querySelector('button');btn.onclick = function (){history.forward();}</script>
</body>
<body><a href="_BOM_07.1-index.html">前往首页</a><button>点我返回</button><script>var btn = document.querySelector('button');btn.onclick = function (){history.back();}</script>
</body>

这样的话两个页面分别就有两个标签,在首页点击a标签之后进入到home页面,这时候就产生了历史记录,可以点击返回按钮返回,返回之后又可以点击下一步再次进入到首页。

可以在括号中写上数字,控制前进后退的步数

页面偏移量 offsetLeft 与 offsetTop

style的区别

  1. offset系列的返回值都是没有单位的,是一个纯数字,style可以
  2. offset不可以被赋值,style可以
  3. offset返回的宽度等信息包含paddingborderwidth的宽度和高度,style不包含

offsetLeftoffsetTop

  1. 返回的都是距离可视窗口(页面部分)左上角的定位
  2. 返回值是一个数字
  3. 不可以进行赋值

offsetWidthoffsetHeight

  1. 返回的是宽度和高度
  2. 包含paddingborderwidth的宽度和高度
  3. 如果元素的宽度是xx%,那么当浏览器大小发生变化时,该值也会动态发生变化
  4. 返回值是一个数字

offsetParent

  1. 返回的是父元素
  2. 如果父亲不带有定位,那么则会逐级向上找,直到找到带定位的元素(这是与fatherNode的区别)

以下代码的页面显示效果与控制台输出效果如下图所示:

在这里插入图片描述

<head><meta charset="UTF-8"><title>页面偏移量</title><style>body {width: 100%;height: 100%;margin: 0;}#father {position: relative;margin-top: 400px;margin-left: 800px;background: antiquewhite;width: 200px;height: 200px;border: .1px solid red;}#son {background: aqua;width: 100px;height: 100px;margin: 50px;}</style>
</head>
<body><div id="father"><div id="son"></div></div><script>var father = document.querySelector('#father');var son = document.querySelector('#son');console.log(father.offsetLeft); // 800console.log(father.offsetTop);  // 400// 页面的宽度包含padding、border、width// 如果高度或者宽度是100%,那么当浏览器窗口大小变化的时候,这个值也会动态变化console.log(father.offsetWidth); // 200console.log(father.offsetHeight);  // 200// 如果father带有定位(position: relative;),那么将会显示father,如果直接的father不带有定位,则逐级向上寻找,直到找到带定位的console.log(son.offsetParent);</script>
</body>

client 系列

与offset最大的区别就是不包含边框

client系列属性说明
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框大小
element.clientWidth返回自身包含padding、内容区的宽度,不包含边框,返回一个数值
element.clientHeight返回自身包含padding、内容区的高度,不包含边框,返回一个数值
<head><meta charset="UTF-8"><title>client | 系列页面偏移量</title><style>div {width: 200px;height: 200px;background: pink;border: 3px solid red;margin: 200px auto;}</style></head>
<body><div></div><script>var div = document.querySelector('div');console.log(div.clientHeight);  // 200console.log(div.clientWidth);   // 200console.log(div.clientTop);     // 3console.log(div.clientLeft);    // 3</script>
</body>

注意:无法获取下边框与右边框大小

scroll系列

scroll 属性

scroll 系列与offset系列和client系列最大的区别在于,如果元素内部的内容溢出了(如文字长度溢出或者内部div高度比当前元素高),那么scroll显示的实际的高度和宽度。

scorll系列属性说明备注
element.scrollTop返回被卷去的上侧距离返回值不带参数
element.scrollLeft返回被卷去的左侧距离返回值不带参数
element.scrollWidth返回自身实际的宽度,不含边框返回值不带参数
element.scrollHeight返回自身实际的高度,不含边框返回值不带参数

在这里插入图片描述

横向超出一样的道理

scroll 方法

div.addEventListener('scroll',function (){console.log(div.scrollTop)
})

当滚动条发生变化时触发

注意:当调用对象是document的时候,要使用window.pageYOffset,如果要计算左侧则是window.pageXOffset

简单解释一下:我们上面说的scroll系列应对的是页面内的元素,比如页面内有一个小div内部又套了一个div,这时候要使用scroll系列,但是操作document的时候,操作的是整个页面,我们要使用windows.pageX/YOffset

移动端事件

触屏touch事件说明
touchstart手指触摸到一个DOM元素时触发
touchmove手指在一个DOM元素上滑动时触发
touchend手指离开一个DOM元素时触发

示例:写一个DIV,在移动端分别进行手指触摸、手指移动和手指离开操作

<head><meta charset="UTF-8"><title>移动端touchstart事件</title><style>div {width: 300px;height: 300px;background: pink;}</style>
</head>
<body><div></div><script>var div = document.querySelector('div');div.addEventListener('touchstart',function (e) {console.log('手指摸上去了');})div.addEventListener('touchmove',function (e) {console.log('手指正在移动');})div.addEventListener('touchend',function (e) {console.log('手指离开了');})</script>
</body>

以上代码的测试结果如下图所示:

在这里插入图片描述

如果要自己测试,记得F12并按照红色箭头方向打开移动端模式。

触摸时间对象

  1. touchs:正在触摸屏幕的所有手机的列表(是一个列表,由于可以多指触摸,所以是一个列表)
  2. targetTouches:正在触摸当前DOM元素伤的手指列表
  3. changedTouches:手指状态发生了改变的列表,从无到有,从有到无的变化

本地存储

  1. sessionStorage:生命周期为关闭浏览器窗口,同页面下数据可以共享(关闭页面或新建页面后失效),以键值对存储,存储空间约5M
  2. sessionStorage:多页面(同一浏览器内)共享(重启浏览器依旧生效),不同页面的数据可以共享,以键值对存储,存储空间约20M

sessionStorage

sessionStorage方法说明备注
setItem(‘key’,value)存储一个数据存储空间约5M
getItem(‘key’)使用key获取一个数据
removeItem(‘key’)删除一个数据
clear()清空所有数据

localStorage

localStorage方法说明备注
setItem(‘key’,value)存储一个数据存储空间约20M
getItem(‘key’)使用key获取一个数据
removeItem(‘key’)删除一个数据
clear()清空所有数据

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

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

相关文章

go build

go build 作用&#xff1a;将Go语言程序和相关依赖编译成可执行文件 go build 无参数编译 生成当前目录名的可执行文件并放置于当前目录下&#xff0c;如&#xff1a; go build go build文件列表 编译同目录的多个源码文件时&#xff0c;可以在 go build 的后面提供多个文件…

C语言:幂的末尾

题目描述 a^b的末3位数是多少&#xff1f; 输入输出格式 输入格式 两个正整数a&#xff0c;b。1≤a≤100&#xff0c;1≤b≤10000。 输出格式 从高位到低位输出幂的末三位数字&#xff0c;中间无分隔符。若幂本身不足三位&#xff0c;在前面补零。 完整代码 #include <std…

vim 实用快捷键

文章目录 1. 翻页2. 字跳转3. 单行编辑4. 多行操作 1. 翻页 快捷键含义快捷记录ctrl-u上翻半页upctrl-d下翻半页downctrl-f上翻一页forwardctrl-b下翻一页backward 2. 字跳转 快捷键含义快捷记录b跳到上一个字首beforeB跳到上一个字首&#xff0c;长跳e跳到下一个字尾endE跳…

QT设置窗口随窗体变化(窗口文本框随窗体的伸缩)

目录 1.建立新窗口2.最终效果 1.建立新窗口 1&#xff09;在窗体中创建一个 textBrowser&#xff0c;记录坐标及宽高 X-100 Y-130 宽-571 高-281&#xff0c;窗体宽高800*600&#xff1b; 2&#xff09;在.h头文件中插入void resizeEvent(QResizeEvent *event) override;函数 …

深度学习之pytorch 中 torch.nn介绍

1. torch.nn 介绍 pytorch 中必用的包就是 torch.nn&#xff0c;torch.nn 中按照功能分&#xff0c;主要如下有几类&#xff1a; 1. Layers&#xff08;层&#xff09;&#xff1a;包括全连接层、卷积层、池化层等。 2. Activation Functions&#xff08;激活函数&#xff09…

速盾网络:有什么不用备案的CDN吗?

备案是指将网站相关信息提交给当地通信管理部门进行备案登记&#xff0c;以确保网站的合法性和规范运营。然而&#xff0c;对于一些特定的CDN服务&#xff0c;是否存在不用备案的情况呢&#xff1f;让我们来了解一下速盾网络在这方面的看法和实践。 备案与CDN服务 在中国大陆…

在qml中的ShaderEffect在arm板的3568的系统上是用GPU渲染的吗

在QML中的ShaderEffect通常是利用GPU进行渲染的。 ShaderEffect 是 Qt Quick 提供的一个功能强大的组件&#xff0c;它允许开发者在 QML 层面实现像素级别的操作。这个组件的设计目的就是为了充分利用 GPU 的强大计算能力来进行图形渲染。因此&#xff0c;当你在 QML 中使用 S…

挑战!贪吃蛇小游戏的实现(3)

经过&#xff08;1&#xff09;&#xff08;2&#xff09;两篇文章的介绍&#xff0c;相信大家对该游戏的实现已经有了具体的思路&#xff0c;废话不多说&#xff0c;让我们开始实现相关的代码吧&#xff01; 1.游戏主逻辑 void test() {int ch 0;srand((unsigned int)time(NU…

【Unity3D】ASE制作天空盒

找到官方shader并分析 下载对应资源包找到\DefaultResourcesExtra\Skybox-Cubed.shader找到\CGIncludes\UnityCG.cginc观察变量, 观察tag, 观察代码 需要注意的内容 ASE要处理的内容 核心修改 添加一个Custom Expression节点 code内容为: return DecodeHDR(In0, In1);outp…

JavaSpringBoot中,Mybatis plus 语法展示

目录 语法展示 基础的增删改查 分页查询 语法指导 删除操作 条件操作 语法展示 Mapper public interface UserMapper extends BaseMapper<User> {} public interface UserService extends IService<User> {} Service public class UserServiceImpl extends…

在Win系统部署WampServer并实现公网访问本地服务【内网穿透】

目录 推荐 前言 1.WampServer下载安装 2.WampServer启动 3.安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4.固定公网地址访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0…

企业资产|企业资产管理系统|基于springboot企业资产管理系统设计与实现(源码+数据库+文档)

企业资产管理系统目录 目录 基于springboot企业资产管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、用户审核管理 3、资产分类管理 4、资产信息管理 5、资产信息添加 6、资产借出统计 7、资产归还审核 8、资产维修管理 9、资产维修…

事务的4大特性、隔离级别、传播机制

目录 一、4大特性&#xff08;ACID&#xff09;二、隔离级别三、传播机制 一、4大特性&#xff08;ACID&#xff09; 原子性&#xff08;A&#xff09;&#xff1a;在一个事务中&#xff0c;要么全部成功&#xff0c;要么全部失败。一致性&#xff08;C&#xff09;&#xff1…

effective c++ 笔记 条款26-31

条款 26&#xff1a;尽可能延后变量定义式出现的时间 应该延后变量的定义&#xff0c;直到非得使用该变量的前一刻为止&#xff0c;甚至应该尝试延后这份定义直到能够给它初值实参为止&#xff0c;以此避免构造&#xff08;和析构&#xff09;非必要对象&#xff0c;还可以避免…

c++笔记理解

1.封装 &#xff08;1&#xff09;构造函数不是必须在的 可以通过行为修改属性 &#xff08;2&#xff09;private和protected区别在于继承那里要学 &#xff08;3&#xff09;类默认是私有&#xff0c;struct是共有 私有的好处&#xff1a;控制数据的有效性&#xff0c;意…

编程笔记 Golang基础 012 项目构建

编程笔记 Golang基础 012 项目构建 一、模块&#xff08;Module&#xff09;、包&#xff08;Package&#xff09;和文件二、项目结构三、VsCode项目管理四、Goland项目管理五、工作空间小结 如何构建和组织一个项目&#xff0c;是学习该语言编程的开始。 一、模块&#xff08;…

MySQL 8.0.36 WorkBench安装

一、下载安装包 百度网盘链接&#xff1a;点击此处下载安装文件 提取码&#xff1a;hhwz 二、安装&#xff0c;跟着图片来 选择Custom,然后点Next 顺着左边框每一项的加号打开到每一个项的最底层&#xff0c;点击选中最底层的项目&#xff0c;再点击传过去右边的绿色箭头&a…

Codeforces Round 530 (Div. 2)

CF1099A Snowball 题目 有一个重量为 w 的雪球正在高度为 h 的地方向下滚动。每秒它的高度会减少 1。同时在高度 i 的位置它的重量会增加 i&#xff08;包括初始位置&#xff09; 同时在滚动的路线上有 2 块石头&#xff0c;第 i 块石头的高度为 hi​&#xff0c;即雪球会在 hi…

【论文阅读|基于 YOLO 的红外小目标检测的逆向范例】

基于 YOLO 的红外小目标检测的逆向范例 摘要1 引言2 相关工作2.1 逆向推理2.2 物体检测方法 3 方法3.1 总体架构3.2 逆向标准的可微分积分 4 实验4.1 数据集和指标4.2 实验环境4.4 OL-NFA 为少样本环境带来稳健性 5 结论 论文题目&#xff1a; A Contrario Paradigm for YOLO-b…