当前位置: 首页 > article >正文

十、JavaScript对象

一、对象

创建对象的方法有三种:字面量、new、构造函数。

1.利用字面量创建对象

花括号{}里面包含了表达这个具体事物(对象)的属性和方法

        // 1.利用对象字面量创建对象{}// var obj = {};  // 创建了一个空的对象var obj = {uname: 'black',age: 400,sex: '男',sayHi: function() {console.log('hi~');}}// (1) 里面的属性或者方法我们采取键值对的形式  键 属性名 : 值  属性值// (2) 多个属性或者方法中间用逗号隔开的// (3) 方法冒号后面跟的是一个匿名函数// 2.使用对象// (1) 调用对象的属性  我们采取  对象名.属性名  . 我们理解为 的console.log(obj.uname);  // black// (2) 调用属性还有一种方法  对象名['属性名']console.log(obj['age']);  // 400// (3) 调用对象的方法  sayHi  对象名.方法名()  千万别忘记添加小括号obj.sayHi();  // hi~

案例:

        var dog = {name: 'keke',type: 'alasijia',age: 5,color: 'br',bark: function() {console.log('汪汪汪');},showFilm: function() {console.log('i can act~');}}console.log(dog.name);console.log(dog['age']);dog.bark();dog.showFilm();
2.变量、属性、函数、方法总结

变量:单独声明赋值,单独存在
属性:对象里面的变量称为属性,不需要声明,用来描述该对象的特征
函数:单独存在的,通过“函数名()”的方式就可以调用
方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用,方法用来描述该对象的行为和功能

3.利用new Object创建对象
        var obj = new Object();  // 创建了一个空的对象obj.uname = 'black';obj.age = 23;obj.sex = '男';obj.sayHi = function() {console.log('hi~');}// (1) 我们是利用 等号 = 赋值的方法  添加对象的属性和方法// (2) 每个属性和方法之间用 分号结束console.log(obj.uname);console.log(obj.age);obj.sayHi();

案例:

        var obj = new Object();obj.name = '鸣人';obj.sex = '男';obj.age = 19;obj.skill = function(){console.log('影分身术');}console.log(obj.name);console.log(obj['age']);obj.skill();
4.利用构造函数创建对象
(1)为什么需要使用构造函数

因为前面两种创建对象的方式一次只能创建一个对象
我们一次创建一个对象,里面有很多的属性和方法是大量相同的 我们只能复制
因此 我们可以利用函数的方法 重复这些相同的代码 我们就把这个函数称为 构造函数
又因为 这个函数不一样,里面封装的不是普通的代码,而是 对象
构造函数 就是把我们对象里面一些相同的属性和方法抽象出来封装到函数里面

(2)利用构造函数创建对象

构造函数的语法格式:

        function 构造函数名() {this.属性 =;this.方法 = function() {}}new 构造函数名();

创建四大天王的对象 相同的属性: 名字 年龄 性别 相同的方法:唱歌

		// 1. 构造函数  泛指的某一大类  类似于Java语言里面的 类(class)function Star(uname, age, sex) {this.name = uname;this.age = age;this.sex = sex;this.sing = function(sang) {console.log(sang);}}// 2. 对象  是一个具体的事物  刘德华 == {name: "刘德华", age: 18, sex: "男", sing: f}var ldh = new Star('刘德华', 18, '男');  // 调用函数返回的是一个对象// console.log(typeof ldh);  // objectconsole.log(ldh.name);console.log(ldh.age);ldh.sing('冰雨');var zxy = new Star('张学友', 19, '男');console.log(zxy.name);console.log(zxy.age);zxy.sing('李香兰');

在这里插入图片描述

1.构造函数名字首字母要大写
2.构造函数不需要return 就可以返回结果
3.调用构造函数 必须使用new
4.我们只要new Star() 调用函数就创建一个对象 ldh {}
5.我们的属性和方法前面必须添加 this

利用构造函数创建对象的过程也称为对象的实例化⭐⭐⭐

案例:

		function Hero(uname, type, blood) {this.name = uname;this.type = type;this.blood = blood;this.attack = function(att) {console.log(att);}}var lp = new Hero('廉颇','力量型', 500);console.log(lp.name);console.log(lp.type);console.log(lp.blood);lp.attack('近战');var hy = new Hero('后裔','射手型', 100);console.log(hy.name);console.log(hy.type);console.log(hy.blood);hy.attack('近战');

在这里插入图片描述

(3)new关键字执行过程

1.在内存中创建一个新的空对象
2.让 this 指向这个新对象
3.执行构造函数里面的代码,给这个新对象添加属性和方法
4.返回这个新对象(所以构造函数里面不需要return)

(4)遍历对象

for … in 语句用于对数组或者对象的属性进行循环操作。

        var obj = {name: 'black',age: 18,sex: '男'}// console.log(obj.name);  // black// console.log(obj['age']);  // 18 // console.log(obj.sex);  // 男// for in 遍历我们的对象// for (变量 in 对象) {// }for (var k in obj) {// console.log(k);  // k 变量 输出  得到的是 属性名 name  age  sexconsole.log(obj[k]);  // obj[k] 得到的是 属性值    black   18  男}// 我们使用 for in 里面的变量  我们喜欢写 k 或者 key

二、内置对象

查阅MDN文档

1. Math对象
(1)数学对象Math最大值方法
        // Math 数学对象  不是一个构造函数, 所以我们不需要 new 来调用  而是直接使用里面的属性和方法即可console.log(Math.PI);  // 3.141592653589793console.log(Math.max(1, 99, 3));  // 99console.log(Math.max(-1, -10));  // -1console.log(Math.max(1, 99, 'black'));  // NaNconsole.log(Math.max());  // -Infinity
(2)封装自己的数学对象
        // 利用对象封装自己的数学对象  里面有 PI 最大值和最小值var myMath = {PI: 3.141592653,max: function() {var max = arguments[0];for (var i = 1; i < arguments.length; i++) {if (max < arguments[i]) {max = arguments[i];}}return max;},min: function() {var min = arguments[0];for (var i = 1; i < arguments.length; i++) {if (min > arguments[i]) {min = arguments[i];}}return min;}}console.log(myMath.PI);  // 3.141592653console.log(myMath.max(1, 5, 9));  // 9console.log(myMath.min(1, 5, 9));  // 1
(3)Math绝对值和三个取整方法
        // 1.绝对值方法console.log(Math.abs(1));  // 1console.log(Math.abs(-1));  // 1console.log(Math.abs('-1'));  // 1   隐式转换  会把字符串型  -1  转换为数字型console.log(Math.abs('pink'));  // NaN// 2.三个取整方法// (1) Math.floor()   地板  向下取整  往最小了取值  console.log(Math.floor(1.1));  // 1console.log(Math.floor(1.9));  // 1// (2) Math.ceil()  天花板  向上取整  往最大了取值console.log(Math.ceil(1.1));  // 2console.log(Math.ceil(1.9));  // 2// (3) Math.round()  四舍五入  其他数字都是四舍五入,但是 .5  特殊  它往大了取console.log(Math.round(1,1));  // 1console.log(Math.round(1.5));  // 2console.log(Math.round(1.9));  // 2console.log(Math.round(-1.1));  // -1console.log(Math.round(-1.5));  // 这个结果是 -1
(4)Math随机数方法random()

random() 返回一个随机的小数 0 <= x < 1
这个方法里面不跟参数

        console.log(Math.random());   

我们想要得到两个数之间的随机整数 并且 包含着两个整数

        // Math.floor(Math.random() * (max - min + 1)) + min;function getRandom(min, max) {return Math.floor(Math.random() * (max - min + 1)) + min;}console.log(getRandom(1, 10));// 随机点名var arr = ['张三', '李四', '王五', '小明', '小红'];console.log(arr[getRandom(0, arr.length - 1)]);
2. 日期对象
(1)Date日期对象的使用

Date 对象和 Math 对象不一样, 它是一个构造函数,所以我们需要实例化后才能使用
Date 实例用来处理日期和时间
使用:
(1)获取当前时间必须实例化:

        var now = new Date();console.log(now);  // Sat Mar 22 2025 16:10:46 GMT+0800 (中国标准时间)

(2)Date() 构造函数的参数
如果括号里面有时间,就返回参数里面的时间。例如日期格式字符串为 ‘2019-5-1’ ,可以写成newDate(‘2019-5-1’) 或者 new Date(‘2019/5/1’)

        var data1 = new Date(2019, 10, 1);console.log(data1);  // Fri Nov 01 2019 00:00:00 GMT+0800 (中国标准时间)  返回的是11月 不是12月var data2 = new Date("2019-10-1 8:8:8");console.log(data2);  // Tue Oct 01 2019 08:08:08 GMT+0800 (中国标准时间)
(2)格式化日期年月日星期

在这里插入图片描述

        var date = new Date();console.log(date.getFullYear());  // 返回当前日期的年  2025console.log(date.getMonth() + 1);  // 3  月份  返回的月份小一个月  0-11  记得月份 + 1console.log(date.getDate());  // 22  返回的是  几号console.log(date.getDay());  // 6   周一返回的是 1 周六返回的是 6 但是 周日返回的是 0// 写一个  2025年  3月  22日  星期六var year = date.getFullYear();var month = date.getMonth() + 1;var dates = date.getDate();var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];var day = date.getDay();console.log('今天是:' + year + '年' + month + '月' + dates + '日 ' + arr[day]);  // 今天是:2025年3月22日 星期六
(3)格式化日期时分秒
        var date = new Date();console.log(date.getHours());  // 时console.log(date.getMinutes());  // 分console.log(date.getSeconds());  // 秒// 要求封装一个函数返回当前的时分秒function getTime() {var time = new Date();var h = date.getHours();h = h < 10 ? '0' + h : h;var m = date.getMinutes();m = m < 10 ? '0' + m : m;var s = date.getSeconds();s = s < 10 ? '0' + s : s;return h + ':' + m + ':' + s;}console.log(getTime());  // 17:18:03
(4)Date总的毫秒数(时间戳)
        // 获得Date总的毫秒数(时间戳)  不是当前时间的毫秒数  而是距离1970年1月1号过了多少毫秒数// 1.通过valueOf()  getTime()var date = new Date();console.log(date.valueOf());  // 1742635411825console.log(date.getTime());  // 1742635411825// 2.简单的写法(最常用的写法)var date1 = +new Date();  // +new Date()  返回的就是总的毫秒数console.log(date1);  // 1742635411825// 3.HS 新增的  获得总的毫秒数console.log(Date.now());  // 1742635411825
(5)倒计时

在这里插入图片描述

        function countDown(time) {var nowTime = +new Date();  // 返回的是当前时间总的毫秒数var inputTime = +new Date(time);  // 返回的是用户输入时间总的毫秒数var times = (inputTime - nowTime) / 1000;  // times 是剩余时间总的秒数  1秒 = 1000 毫秒var d = parseInt(times / 60 / 60 / 24);  // 天d = d < 10 ? '0' + d : d;var h = parseInt(times / 60 / 60 % 24);  // 时h = h < 10 ? '0' + h : h;var m = parseInt(times / 60 % 60);  // 分m = m < 10 ? '0' + m : m;var s = parseInt(times % 60); // 当前的秒s = s < 10 ? '0' + s : s;return d + '天' + h + '时' + m + '分' + s + '秒';}console.log(countDown('2025-3-22 20:00:00'));
3. 数组对象
(1)数组创建的两种方式
        // 1.利用数组字面量var arr = [1, 2, 3];console.log(arr[0]);  // 1// 2.利用new Array()// var arr1 = new Array();  // [] 创建了一个空的数组// var arr1 = new Array(2);  // (2) [空属性 × 2]   这个 2 表示 数组的长度为 2  里面有 2 个空的数组元素var arr1 = new Array(2, 3);  // (2) [2, 3]     等价于 [2, 3] 这样写表示  里面有2个数组元素  是 2和3console.log(arr1);
(2)检测是否为数组两种方式

1.instanceof 运算符 它可以用来检测是否为数组

        var arr = [];var obj = {};console.log(arr instanceof Array);  // trueconsole.log(obj instanceof Array);  // false

2.Array.isArray(参数); H5新增的方法 ie9以上版本支持

        var arr = [];var obj = {};console.log(Array.isArray(arr));  // trueconsole.log(Array.isArray(obj));  // false
(3)添加、删除数组元素

在这里插入图片描述

        // 添加删除数组元素的方法// 1. push() 在我们数组的末尾  添加一个或多个数组元素  push  推var arr = [1, 2, 3];// arr.push(4, 'pink');console.log(arr.push(4, 'pink'));  // 5console.log(arr);  // [1, 2, 3, 4, 'pink']// (1) push 是可以给数组追加新的元素// (2) push() 参数直接写  数组元素就可以了// (3) push 完毕之后,返回的结果是 新数组的长度// (4) 原数组也会发生变化// 2. unshift() 在我们数组的开头  添加一个或者多个数组元素console.log(arr.unshift('red', 'purple'));  // 7console.log(arr);  //  ['red', 'purple', 1, 2, 3, 4, 'pink']// (1) unshift 是可以给数组前面追加新的元素// (2) unshift() 参数直接写  数组元素就可以了// (3) unshift 完毕之后,返回的结果是 新数组的长度// (4) 原数组也会发生变化// 3. pop() 它可以删除数组的最后一个元素console.log(arr.pop());  //  pinkconsole.log(arr);  // ['red', 'purple', 1, 2, 3, 4]// (1) pop 是可以删除数组的最后一个元素  记住一次只能删除一个元素// (2) pop() 没有参数// (3) pop 完毕之后,返回的结果是 删除的那个元素// (4) 原数组也会发生变化// 4. shift() 它可以删除数组的第一个元素console.log(arr.shift());  // redconsole.log(arr);  // ['purple', 1, 2, 3, 4]// (1) shift 是可以删除数组的第一个元素  记住一次只能删除一个元素// (2) shift() 没有参数// (3) shift 完毕之后,返回的结果是 删除的那个元素// (4) 原数组也会发生变化
(4)筛选数组

有一个包含工资的数组[1500,1200,2000,2100,1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面

        var arr = [1500, 1200, 2000, 2100, 1800];var newArr = [];for (var i = 0; i < arr.length; i++) {if (arr[i] < 2000) {newArr.push(arr[i]);}}console.log(newArr);  //  [1500, 1200, 1800]
(5)数组排序

在这里插入图片描述

        // 1. 翻转数组var arr = ['pink', 'red', 'blue'];arr.reverse();console.log(arr);  //  ['blue', 'red', 'pink']// 2. 数组排序(冒泡排序)var arr1 = [3, 4, 7, 1]arr1.sort();console.log(arr1);  //  [1, 3, 4, 7]// 但是var arr1 = [13, 4, 77, 1, 7]arr1.sort();console.log(arr1);  //  [1, 13, 4, 7, 77]  按照个位的大小排序了// 解决方法var arr1 = [13, 4, 77, 1, 7]arr1.sort(function(a, b) {// return a - b;  // [1, 4, 7, 13, 77]  //升序的顺序排列return b - a;  // [77, 13, 7, 4, 1]  // 降序的顺序排列});console.log(arr1);
(6)获取数组元素索引

在这里插入图片描述

        // indexOf(数组元素)  作用就是返回该数组元素的索引号  从前面开始查找// 它只返回第一个满足条件的索引号// 它如果在该数组里面找不到元素,则返回的是 -1var arr = ['red', 'green', 'blue', 'pink', 'blue'];console.log(arr.indexOf('blue'));  // 2var arr1 = ['red', 'green', 'pink'];console.log(arr1.indexOf('blue'));  // -1// lastIndexOf(数组元素)  作用就是返回该数组元素的索引号  从后面开始查找var arr2 = ['red', 'green', 'blue', 'pink', 'blue'];console.log(arr2.lastIndexOf('blue'));  // 4
(7)数组去重案例

在这里插入图片描述

        // 封装一个  去重的函数  unique  独一无二的function unique(arr) {var newArr = [];for (var i = 0; i < arr.length; i++) {if (newArr.indexOf(arr[i]) === -1) {newArr.push(arr[i]);}}return newArr;}var demo = unique(['blue', 'green', 'blue']);console.log(demo);  // ['blue', 'green']
(8)数组转换为字符串

在这里插入图片描述

        // 1.toString()  将我们的数组转换为字符串var arr = [1, 2, 3];console.log(arr.toString());  // 1,2,3// 2.join(分隔符)var arr1 = ['green', 'blue', 'pink'];console.log(arr1.join());  // green,blue,pinkconsole.log(arr1.join('-'));  // green-blue-pinkconsole.log(arr1.join('&'));  // green&blue&pink
4. 字符串对象
(1)基本包装类型
        // 基本包装类型var str = 'andy';console.log(str.length);  // 4// 对象 才有 属性和方法  复杂数据类型才有  属性和方法// 简单数据类型为什么会有 length 属性呢?// 基本包装类型:  就是把简单数据类型  包装成为了  复杂数据类型// (1) 把简单数据类型包装为复杂数据类型var temp = new String('andy');// (2) 把临时变量的值 给 strstr = temp;// (3) 销毁这个临时变量temp = null;
(2)字符串不可变

虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。

(3)根据字符返回位置

字符串的所有方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
在这里插入图片描述

        // 字符串对象  根据字符返回位置  str.indexOf('要查找的字符', [起始的位置])var str = '改革春风吹满地,春天来了';console.log(str.indexOf('春'));  // 2console.log(str.indexOf('春', 3));  // 8  // 从索引号是 3 的位置开始往后查找
(4)求某个字符出现的位置以及次数
        var str = "abcoefoxyozzopp";var index = str.indexOf('o');var num = 0;while (index !== -1) {console.log(index);num++;index = str.indexOf('o', index + 1);  // 3 6 9 12}console.log('o出现的次数是' + num);  // 4
(5)根据位置返回字符

在这里插入图片描述

        // 根据位置返回字符// 1. charAt(index) 根据位置返回字符var str = 'andy';console.log(str.charAt(3));  // yfor (var i = 0; i < str.length; i++) {console.log(str.charAt(i));  // a n d y}// 2. charCodeAt(index)  返回相应索引号的字符ASCII值  目的:判断用户按下了哪个键console.log(str.charCodeAt(0));  // 97// 3. str[index]  H5新增的console.log(str[0]);  // a
(6)统计出现次数最多的字符
        var str = 'abcoefoxyozzopp';var o = {};for (var i = 0; i < str.length; i++) {var char = str.charAt(i);  // char 是 字符串的每一个字符if (o[char]) {  // o[char] 得到的是属性值o[char]++;} else {o[char] = 1;}}console.log(o);// 2. 遍历对象var max = 0;var ch = '';for (var k in o) {if (o[k] > max) {max = o[k];ch = k;}}console.log(max);console.log('最多的字符是' + ch);
(7)拼接以及截取字符串

在这里插入图片描述

        // 字符串操作方法// 1. concat('字符串1', '字符串2'……)var str = 'andy';console.log(str.concat('red'));  // andyred// 2. substr('截取的起始位置', '截取几个字符');var str1 = '改革春风吹满地';console.log(str1.substr(2, 2));  // 春风
(8)替换字符串以及转换为数组
        // 1. 替换字符 replace('被替换的字符', '替换为的字符') 它只会替换第一个字符var str = 'andyandy';console.log(str.replace('a', 'b'));  // bndyandy// 有一个字符串 'abcoefoxyozzopp' 要求把里面所有的 o 替换为 *var str1 = 'abcoefoxyozzopp';while (str1.indexOf('o') !== -1) {str1 = str1.replace('o', '*');}console.log(str1);  // abc*ef*xy*zz*pp// 2. 字符转换为数组  split('分隔符')   前面我们学过 join 把数组转换为字符串var str2 = 'red, pink, blue';console.log(str2.split(','));  // ['red', ' pink', ' blue']var str3 = 'red&pink&blue';console.log(str3.split('&'));  // ['red', ' pink', ' blue']// 其他:// toUpperCase()  转换大写// toLowerCase()  转换小写

相关文章:

十、JavaScript对象

一、对象 创建对象的方法有三种&#xff1a;字面量、new、构造函数。 1.利用字面量创建对象 花括号{}里面包含了表达这个具体事物&#xff08;对象&#xff09;的属性和方法 // 1.利用对象字面量创建对象{}// var obj {}; // 创建了一个空的对象var obj {uname: black,ag…...

FFmpeg开发学习:音视频封装

1.基本流程 1.输入参数 输出文件路径 char *output 视频编码参数 AVCodecParameters *video_par 音频编码参数 AVCodecParameters *audio_par 数据包 AVPacket *packets[] 2.封装流程 &#xff08;1&#xff09;创建输出的上下文AVFormatContext指针 AVFormatContext *out_fm…...

hackmyvm-reversteg

arp-scan -l nmap -sS -v 192.168.222.45 在源码中可以看到 根据下面的提示可以猜测117db0148dc179a2c2245c5a30e63ab0是一个图像文件 将图片下载到本地 隐写术 在两张图片上使用strings,发现有一些可打印的字符串 strings 117db0148dc179a2c2245c5a30e63ab0.jpg base64解码…...

UE4学习笔记 FPS游戏制作17 让机器人持枪 销毁机器人时也销毁机器人的枪 让机器人射击

添加武器插槽 打开机器人的Idle动画&#xff0c;方便查看武器位置 在动画面板里打开骨骼树&#xff0c;找到右手的武器节点&#xff0c;右键添加一个插槽&#xff0c;重命名为RightWeapon&#xff0c;右键插槽&#xff0c;添加一个预览资产&#xff0c;选择Rifle&#xff0c;根…...

考研408-数据结构完整代码 线性表的链式存储结构 - 单链表

单链表操作详解&#xff08;C实现&#xff09; 目录 单链表尾插法创建单链表头插法创建删除指定节点按值查找按序号查找插入节点完整代码示例注意事项总结 尾插法创建 #include<bits/stdc.h> using namespace std;typedef struct LNode {int data;struct LNode* next;…...

蓝桥杯经典题解:班级活动分组问题的深度解析与优化实现

目录 一、问题背景与描述 二、问题分析与核心思路 2.1 问题本质&#xff1a;统计与配对优化 2.2 关键观察 2.3 数学建模 三、算法设计与实现步骤 3.1 算法步骤 3.2 代码实现&#xff08;Python&#xff09; 3.3 优化点分析 四、关键细节与常见误区 4.1 细节处理 4.…...

设计模式(创建型)-建造者模式

定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。该模式允许通过多个简单的步骤逐步构建出一个复杂的对象&#xff0c;用户只需指定复杂对象…...

RIP和OSPF的区别

文章目录 RIP&#xff08;路由信息协议&#xff09;和 OSPF&#xff08;开放最短路径优先&#xff09;是两种常见的动态路由协议&#xff0c;它们的主要区别如下&#xff1a;1. 协议类型2. 更新方式3. 路由计算算法4. 最大跳数5. 管理距离&#xff08;AD&#xff09;6. 认证机制…...

Git 之配置ssh

1、打开 Git Bash 终端 2、设置用户名 git config --global user.name tom3、生成公钥 ssh-keygen -t rsa4、查看公钥 cat ~/.ssh/id_rsa.pub5、将查看到的公钥添加到不同Git平台 6、验证ssh远程连接git仓库 ssh -T gitgitee.com ssh -T gitcodeup.aliyun.com...

遍历数组时,如何获取数组每个元素索引号

在 JavaScript 中&#xff0c;有多种方法可以在遍历数组时获取每个元素的索引号&#xff0c;下面为你介绍几种常用的方法&#xff1a; 1. 使用 for 循环 const array [apple, banana, cherry]; for (let i 0; i < array.length; i) {console.log(索引 ${i} 的元素是: ${…...

黑马点评项目

遇到问题&#xff1a; 登录流程 session->JWT->SpringSession->tokenRedis &#xff08;不需要改进为SpringSession&#xff0c;token更广泛&#xff0c;移动端或者前后端分离都可以用&#xff09; SpringSession配置为redis模式后&#xff0c;redis相当于分布式se…...

如何防御TCP洪泛攻击

TCP洪泛攻击&#xff08;TCP Flood Attack&#xff09;是一种常见的分布式拒绝服务&#xff08;DDoS&#xff09;攻击手段&#xff0c;以下是其原理、攻击方式和危害的详细介绍&#xff1a; 定义与原理 TCP洪泛攻击利用了TCP协议的三次握手过程。在正常的TCP连接建立过程中&a…...

【AVRCP】AVRCP核心术语解析

目录 一、协议核心术语&#xff1a;架构的基石 1.1 音视频控制协议簇&#xff08;AVRCP 生态链&#xff09; 1.2 数据传输协议&#xff08;L2CAP 核心术语&#xff09; 二、设备架构术语&#xff1a;角色与交互 2.1 设备角色模型&#xff08;CT/TG 二元架构&#xff09; …...

【弹性计算】异构计算云服务和 AI 加速器(四):FPGA 虚拟化技术

异构计算云服务和 AI 加速器&#xff08;四&#xff09;&#xff1a;FPGA 虚拟化技术 &#x1f680; FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程门阵列&#xff09;是一种可重构的半导体芯片&#xff0c;允许用户根据需要动态配置硬件逻辑&#xff…...

Python爬虫如何检测请求频率?

在进行网络爬虫开发时&#xff0c;合理设置请求频率是确保爬虫稳定运行、避免被目标网站封禁的关键策略之一。以下是一些有效的方法和最佳实践&#xff0c;帮助你合理设置请求频率&#xff0c;确保爬虫的可持续性和稳定性。 一、了解速度限制的原因 网站对爬虫速度进行限制的…...

编译原理——自底向上语法优先分析

文章目录 自底向上优先分析概述一、自底向上优先分析概述二、简单优先分析法&#xff08;一&#xff09;优先关系定义&#xff08;二&#xff09;简单优先文法的定义&#xff08;三&#xff09;简单优先分析法的操作步骤 三、算法优先分析法&#xff08;一&#xff09;直观算符…...

nuxt3网站文章分享微信 ,QQ功能

1.安装 npm install qrcode --save-dev 2.组件使用 <div class"share"><div style"line-height: 69px; color: #fff;width: 100px;"><p style"text-align: center;">分享:</p></div><div click"shareToMi…...

智能任务分配:Python高并发架构设计

Python并发编程实战&#xff1a;多进程与多线程的智能任务分配策略 引言&#xff1a;突破性能瓶颈的关键选择 在CPU核心数量激增和I/O密集型应用普及的今天&#xff0c;Python开发者面临着一个关键抉择&#xff1a;如何通过并发编程充分释放硬件潜力&#xff1f;本文通过实测数…...

Oracle 数据库通过exp/imp工具迁移指定数据表

项目需求&#xff1a;从prod数据库迁移和复制2个表(BANK_STATE&#xff0c;HBS)的数据到uat数据库环境。 数据库版本&#xff1a;Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 迁移工具&#xff1a;客户端exp/imp工具 -- 执行命令 从Prod数据库导出数据exp us…...

批发订货系统:驱动企业数字化转型的核心引擎

在数字经济时代&#xff0c;传统批发企业正面临供应链效率低、客户体验不足、管理成本高等挑战。而批发订货系统作为企业数字化转型的重要工具&#xff0c;正通过智能化、数据化和流程重构&#xff0c;重塑企业的运营模式&#xff0c;助力企业实现降本增效与业务创新。以下从多…...

STM32F103_LL库+寄存器学习笔记07 - 串口接收缓冲区非空中断

导言 上一章节《STM32F103_LL库寄存器学习笔记06 - 梳理串口与串行发送“Hello,World"》梳理完USART的基本设置与发送字符串“Hello,World"&#xff0c;接着梳理接收缓冲区非空中断。 实用的串口接收程序都会使用中断方式&#xff0c;不会使用轮询方式。最主要的原因…...

python将整个txt文件写入excel的一个单元格?

要将整个txt文件写入Excel的一个单元格&#xff0c;可以使用Python的openpyxl库来实现。以下是一个简单的示例代码&#xff1a; from openpyxl import Workbook# 读取txt文件内容 with open(file.txt, r) as file:txt_content file.read()# 创建一个新的Excel工作簿 wb Work…...

CentOS 8 Stream 配置在线yum源参考 —— 筑梦之路

CentOS 8 Stream ISO 文件下载地址&#xff1a;http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_64/CentOS-Stream-8-20240603.0-x86_64-dvd1.isoCentOS 8 Stream 网络引导ISO 文件下载地址&#xff1a;http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_6…...

生物中心论

Robert Lanza的“生物中心论”&#xff08;Biocentrism&#xff09;是一种以生命和意识为核心的宇宙观&#xff0c;试图颠覆传统科学对时间、空间和物质的理解。 一、核心观点 意识创造宇宙 生物中心论认为&#xff0c;宇宙的存在依赖于观察者的意识。传统科学将宇宙视为独立实…...

LeetCode //C - 650. 2 Keys Keyboard

650. 2 Keys Keyboard There is only one character ‘A’ on the screen of a notepad. You can perform one of two operations on this notepad for each step: Copy All: You can copy all the characters present on the screen (a partial copy is not allowed).Paste:…...

【leetcode hot 100 347】前 K 个高频元素

解法一&#xff1a;用map的value记录key出现的次数&#xff0c;用PriorityQueue构造最小堆。 class Solution {public int[] topKFrequent(int[] nums, int k) {// 把元素放在map中Map<Integer,Integer> map new HashMap<>();for(int num:nums){if(map.containsK…...

Spring三级缓存解决循环依赖的深度解析

一、循环依赖场景 假设存在两个Bean的相互依赖&#xff1a; Component public class ServiceA {Autowiredprivate ServiceB serviceB; }Component public class ServiceB {Autowiredprivate ServiceA serviceA; }二、三级缓存定义 在 DefaultSingletonBeanRegistry 中定义&a…...

Spring AOP:面向切面编程的探索之旅

目录 1. AOP 2. Spring AOP 快速入门 2.1 引入 Spring AOP 依赖 2.2 Spring AOP 简单使用 3. Spring AOP 核心概念 3.1 切点 3.1.1 Pointcut 定义切点 3.1.2 切点表达式 3.1.2.1 execution 表达式 3.1.2.2 annotation 表达式 3.2 连接点 3.3 通知(Advice) 3.3.1 通…...

使用QT画带有透明效果的图

分辨率&#xff1a;24X24 最大圆 代码: #include <QApplication> #include <QImage> #include <QPainter>int main(int argc, char *argv[]) {QImage image(QSize(24,24),QImage::Format_ARGB32);image.fill(QColor(0,0,0,0));QPainter paint(&image);…...

RocketMQ可视化工具使用 - Dashboard(保姆级教程)

1、github拉取代码&#xff0c;地址&#xff1a; https://github.com/apache/rocketmq-dashboard 2、指定Program arguments&#xff0c;本地启动工程 勾上这个Program arguments&#xff0c;会出现多一个对应的框 写入参数 --server.port1280 --rocketmq.config.namesrvAddr…...