JavaScript 基础
JS概念
JS基础概念
-
JS是一种运行在客户端(浏览器)的编程语言, 实现人机交换结果
-
作用:
- 网页特效
- 表单验证
- 数据交互
- 服务端编程(node.js)
-
JS的组成
- ECMAScript—javaScript语言基础
- Web APIs—(DOM: 页面文档对象模型)(BOM: 浏览器对象模型)
JS书写
-
位置
-
内部: 写到< /body >上方
<script>alert('hello js'); </script> </body>
-
外部: 以.js结尾的文件, 然后引入至html中, 引入位置与内部一致
<script src="./index.js"></script> </body>
-
内联: 类似于引入CSS样式
<button onclick="alert('hello world')">f**k me</button>
-
-
注释写法: 与C语言一致, 即 // 和 /* */
-
结束符: 以 ; 为结束符, 在实际开发中可写可不写, 但要统一
字面量
在计算机科学中, 字面量是在计算机中描述 事和物
JS语法
输入和输出
-
输出语法
document.write("<h1> 输出至文档 </h1>");alert("警示框");console.log("控制台打印");
-
输入语法
prompt('在警示框内输入');
变量基础
-
定义
- 用来存储数据的"盒子"
- 变量是容器, 而非数据
-
使用(与C语言差不多)
1. 声明变量:
let age;2. 赋值变量:
age = 18;
-
命名规则与规范
-
规则:
- 不能用关键字
- 只能由下划线、字母、数字、$组成, 不能数字开头
- 字母严格区分大小写
-
规范:
- 起名要有意义, 让人能看的懂
- 起名遵守小驼峰命名法
-
-
var的缺点
- 可以先使用, 再声明(不合理)
- var可以重复声明
- 比如变量提升、全局变量、没有块级作用域等
数组
-
数组是一种将一组数据存储在单个变量名下的优雅方式
let numArr = [1, 2, 3, 4, 5];
-
数组是有序的, 编号从0开始
console.log(numArr[0]); //打印1
-
数组内的数据类型是任意的, 不必一致
-
用.length属性获得数组的长度
console.log(numArr.length);
常量基础
-
定义: 使用const声明的变量称为常量, 声明时必须赋值, 不允许再次赋值
const PI = 3.14;
数据类型
-
意义:
- 更加充分利用高效的利用内存
- 更加方便程序员使用数据
基本数据类型
-
JS 是一门弱数据类型的语言, 不同于 java
-
有以下几种类型(基本数据类型)
- number
- string
- boolean
- undefined
- null
-
如何检测数据类型
typeof(X);
或
typeof X;
-
如何转换数据类型
-
隐式转换
-
‘+’ 两边只要有一个是字符串, 就会把另外一个转为字符串, 但+"123"的操作会把字符型转换为数字型
-
‘-’, ‘*’, ‘/’, '%'等运算符, 会把字符串转换为数字类型
-
-
let numSt = "123";
let numSt1 = numSt + 456; // num = "123456"let num = +numSt; // num = 123
-
显式转换
- Number(数据) — 转化为数字型
- parseInt(数据) — 只保留整数()
- parseFloat(数据) — 保留小数
数字类型(number)
-
算术运算符: + 、- 、* 、/ 、% (优先级为日常运算)
-
当运算时有错误的数据类型会输出 NaN, 任何对 NaN 的操作都会返回 NaN
字符串类型(string)
-
通过单引号, 双引号, 反引号包裹的数据为字符串类型
-
引号之间可以相互嵌套, 但不能相同嵌套
-
可以使用 + 来拼接字符串(数字相加, 字符相连, 字符串 + 数字 = 字符串)
-
当然, JS 和 C 语言一样, 可以格式化输出
let str = `javaScript`; console.log("%s", str);
-
模版字符串, 相较于格式化输出更方便, 字符串必须用反引号, 变量放入${}内
console.log(`这是${str}`);
布尔类型(bool)
-
只有两个值, true 和 false, 表示判断真假
-
“”、0、NaN、null、undefined 都为 false, 其他都为 true
未定义类型
- 只有一个值—undefined, 当声明变量时却没赋值, 则这个变量为未定义类型
null(空类型)
- 只有一个值—null, 把 null 作为尚未创建的对象
运算符
-
类型:
- 赋值运算符
- 自增自减运算符
- 比较运算符
- 逻辑运算符
-
运算符优先级: 与C语言等其他语言相同
赋值运算符
- 对变量进行赋值的运算符, 如 " = ", 其他赋值运算(+=)和 C 语言大差不差
自增自减运算符
- 自增/自减运算符" ++ ", " – ". 用法和 C 语言相同
比较运算符
-
" === " 表示左右值和类型是否全等, " !== " 表示左右两边是否不全等
-
" == "运算符也会进行隐式转换, 转换为数字型
-
NaN 不等于任何类型和值, 包括它自己, 参与它的运算返回值均为 false
-
比较结果为 bool 类型
-
字符串比较, 是比较的字符对应的 ascll 码
逻辑运算符
- 包括" && ", " || ", " ! ", 用法和 C 语言相同
隐式类型转换
-
运算符的左右两边的数据类型不同时, 会进行隐式类型转换, 转换规则如下:
- 布尔值和数字值: 布尔值转换为数字值 1/0, 数字值转换为布尔值 true/false
- 字符串和数字值: 字符串转换为数字值, 数字值转换为字符串
- 字符串和布尔值: 布尔值转换为字符串"true"/“false”
- 其他类型转换为字符串
- 隐式类型转换的优先级低于其他运算符, 如" - "运算符, 它会先将字符串转换为数字值再进行运算
- 只有" + "可以将数字型转换为字符串型, 在字符串与数字的运算中
- 隐式类型转换的常见场景:
- 条件判断语句中的条件表达式
- 算术运算符的操作数
- 赋值运算符的右侧表达式
- 函数调用的参数
- 变量初始化表达式
- 数组元素赋值
- 对象属性赋值
- 等等
运算符的特殊行为(类型转换总结)
- + 运算符:当任一操作数为字符串时,执行字符串拼接
1 + "2" // "12"
true + "false" // "truefalse"
- 其他算术运算符(-, *, /, %):将操作数转换为数字
"5" - 3 // 2
"10" / "2" // 5
- 常见隐式转换场景
- 条件判断
if (1) { /* 会执行,因为1被转换为true */ }
if ("") { /* 不会执行,空字符串被转换为false */ }
- 算术运算
let result = "10" * 2; // 20
- 比较运算
"10" == 10 // true (类型转换后比较)
"10" === 10 // false (严格相等,不转换类型)
- 其他场景
// 函数参数
function log(x) { console.log(x) }
log(123); // 数字
log("123"); // 字符串// 数组元素
let arr = [1, "2", true];// 对象属性
let obj = {num: "123",bool: 1
};注意事项:
== 会进行隐式类型转换,而 === 不会+ 是唯一会优先进行字符串拼接的算术运算符某些转换结果可能出乎意料:[] + {} // "[object Object]"# 语句和结构## 选择(分支)结构### if 语句```javascript
let num = +prompt("请输入一个数字");
if (num % 4 === 0 && num % 100 !== 0) {alert("true");
} else {alert("false");
}
switch 语句
注: switch 匹配时是全等(类型和值), 不只是数值相等
let num1 = +prompt("输入第一个数字");
let num2 = +prompt("输入第二个数字");let sp = prompt("输入运算符");switch (sp) {case "+":alert(num1 + num2);break;case "-":alert(num1 - num2);break;case "*":alert(num1 * num2);break;case "/":alert(num1 / num2);break;default:console.log("运算符错误");
}
基本循环语句
while 语句
let num = 0;
let cut = 0;
while (cut < 10) {num += 2;cut++;
}
alert(num);
-
循环三要素
- 变量起始值
- 终止条件
- 变量变化量
-
break 语句: 跳出循环
-
continue 语句: 跳过本次循环, 继续下一次循环
for 语句
注: 在遍历数组时, 数组越界时会打印 undefined
for (let i = 0; i < 10; i++) {console.log(i);
}
-
for 语句三要素
- 初始化
- 循环条件
- 变化量
-
循环嵌套
for (let i = 0; i < 10; i++) {for (let j = 0; j < 10; j++) {console.log(i + " " + j);}
}
数组进阶
声明数组
- 字面量声明(推荐使用)
let arr = [1, 2, 3, "四", 5, true];
let arr = []; // 声明一个空数组
- 构造函数声明
let arr = new Array(1, 2, 3, "四", 5, true);
let arr = new Array(); // 声明一个空数组
- 构造二维数组(使用字面量构造, 推荐使用)
let numArr = [];
for (let i = 0; i < 10; i++) {numArr[i] = [];for (let j = 0; j < 10; j++) {numArr[i][j] = 0;}
}
- 使用 fill 和 map 方法声明二维数组
const rows = 3;
const cols = 4;
const matrix = new Array(rows).fill().map(() => new Array(cols).fill(0));console.log(matrix);
遍历数组
- for 循环
for (let i = 0; i < arr.length; i++) {console.log(arr[i]);
}
- forEach 方法(数组方法)
arr.forEach(function (item, index, arr) {// item: 数组元素// index: 数组索引// arr: 数组本身console.log(item);
});
- for…of 循环
for (let item of arr) {console.log(item);
}
数组方法
- push 方法
arr.push(6);
// 向数组 arr(末尾) 中添加元素 6
// 返回数组的新长度
- pop 方法
arr.pop();
// 移除数组的最后一个元素
// 返回移除的元素
- shift 方法
arr.shift();
// 移除数组的第一个元素,并返回该元素
- unshift 方法
arr.unshift(0);
// 在数组的开头添加元素 0
- splice 方法
arr.splice(2, 1, 4, 5);
// 从索引 2 开始(包括索引2),删除 1 个元素,并在该位置插入 4, 5
// 若删除0个元素, 则在索引2后面插入元素
// 返回被删除的元素组成的数组
- concat 方法
let newArr = arr.concat([7, 8, 9]);
// 使用 concat 方法将数组 arr 与包含元素 7, 8, 9 的新数组合并,结果存储在 newArr 中
- join 方法
let str = arr.join("-");
// 将数组 arr 中的元素使用 "-" 连接成一个字符串,并赋值给变量 str, 默认使用逗号分隔
- map 方法
// 可以遍历数组处理数据, 并返回一个新的数组
let newArr = arr.map(function (item, index) {return item * 2;
});
- fill 方法
arr.fill(0, 2, 4);
// 用 0 填充数组 arr 中索引 2 到 4 之间的元素(包括第一个索引但不包括最后一个索引)
排序(三大基础排序, 了解即可)
冒泡排序
// 冒泡排序
function bubbleSort(arr) {let len = arr.length;for (let i = 0; i < len - 1; i++) {for (let j = 0; j < len - i - 1; j++) {if (arr[j] > arr[j + 1]) {let temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
选择排序
// 选择排序
function selectionSort(arr) {let len = arr.length;for (let i = 0; i < len - 1; i++) {let minIndex = i;for (let j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}if (minIndex !== i) {let temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}
}
插入排序
// 插入排序
function insertionSort(arr) {let len = arr.length;for (let i = 1; i < len; i++) {let current = arr[i];let j = i - 1;while (j >= 0 && arr[j] > current) {arr[j + 1] = arr[j];j--;}arr[j + 1] = current;}
}
函数
函数的定义
function myFunction(arg1, arg2) {// 函数体return arg1 + arg2;// 返回值
}
函数的调用
myFunction(1, 2); // 3
函数的参数
- 函数可以有0个或多个参数。参数可以是任意类型,包括数字、字符串、对象、数组等。
function myFunction(arg1 = 0, arg2 = 0) { // 默认参数// 函数体return arg1 + arg2;
}let result = myFunction(1, 2); // 3
let result2 = myFunction("hello", "world"); // "helloworld"
函数的返回值
- 函数可以返回任意类型的值,包括数字、字符串、对象、数组等。
function myFunction(arg1, arg2) {// 函数体return arg1 + arg2;// 若要返回多个值,可以返回一个数组// return [arg1, arg2];// 也可以返回对象// return {sum: arg1 + arg2};
}let result = myFunction(1, 2); // 3
console.log(result); // 3
函数的作用域
-
函数的作用域决定了函数内的变量能访问哪些变量,以及它们的值是什么。
-
使用
let
和const
声明的变量,其作用域为函数内部的块级作用域。 -
如果函数内部, 变量没有使用
let
和const
声明, 则该变量为全局变量。 -
函数的形参可以看做局部变量。
-
访问原则: 局部变量 > 全局变量 > 函数参数。
// 使用var声明的变量, 其作用域为函数内部的块级作用域顶部, 但值不会提升到顶部
function myFunction() {console.log(x); // undefined, 因为变量提升, 若用let或const声明, 为ReferenceErrorvar x = 1;console.log(x); // 1
}
函数的作用域链(学习对象之后了解)
-
函数的作用域链是一个对象,它包含了函数执行时的作用域链。
-
当函数执行时,会创建一个作用域链,包含了函数的局部作用域、其上层函数的作用域、全局作用域。
function myFunction() {var x = 1;console.log(x); // 1
}myFunction();console.log(x); // ReferenceError: x is not defined
函数的闭包
- 函数可以访问其外部作用域的变量(全局变量),这种函数称为闭包。
function myFunction() {var x = 1;function innerFunction() {console.log(x); // 1}return innerFunction;
}var myClosure = myFunction();
myClosure();
函数的递归
- 函数可以调用自身,这种函数称为递归函数。
// 阶乘函数
function factorial(n) {if (n === 1) {return 1;} else {return n * factorial(n - 1);}
}console.log(factorial(5)); // 120
匿名函数
var myFunc = function() {console.log("Hello, world!");
};myFunc(); // "Hello, world!"
-
匿名函数与具名函数的区别:
- 具名函数的调用可以写到任何位置
- 匿名函数必须在定义后调用
立即执行函数表达式(IIFE)
- 避免全局变量污染,提高代码的可读性。
(function() {console.log("Hello, world!");
})(); // "Hello, world!"
逻辑中断
- 如果左边能够判断真假, 则不必判断右边。(不推荐使用)
function myFunction(x, y) {x = x || 0;y = y || 0;// 类似于形参的默认值, 若x或y为false, 则返回0return x + y;
}
- 在新语法中, 用空值运算符
const value = someValue ?? "default";
// 只在someValue为null或undefined时使用默认值, default.
对象(object)
什么是对象?
-
在计算机编程中,对象是一个抽象概念,它是由数据和操作数据的行为组成的整体。对象是对现实世界中事物的一种抽象,它可以包含数据和操作数据的行为。对象是由属性和方法组成的,属性是对象的状态,方法是对象可以执行的操作。对象可以被创建、使用、修改和销毁。对象是软件系统的基本构造块,是构成系统的基本单元。
-
在JavaScript中,对象是一个无序的集合,它由属性和方法组成。属性是对象的状态,方法是对象可以执行的操作。对象可以被创建、使用、修改和销毁。对象是JavaScript的核心概念之一。
-
在JS中, 一切皆对象, 包括数字, 字符串, 数组, 函数, 正则表达式, 日期, 等等。
对象创建
- 对象可以被创建使用两种方式:字面量和构造函数。
字面量创建对象(推荐使用)
- 字面量创建对象是指通过直接在代码中定义一个对象,并将属性和方法(函数)赋值给它。
// 创建一个对象
let person = {name: 'John', // 注意标点符号age: 30,'now-time': '2025-03-20', // 属性名中包含特殊字符时,需要用单引号括起来greet: function() {console.log(`Hello, my name is ${this.name}`);}
};console.log(person); // {name: "John", age: 30, greet: ƒ}// 访问对象的属性
console.log(person.name); // John
console.log(person['now-time']); // 2025-03-20, 注意属性名需要用单引号括起来// 调用对象的方法
person.greet(); // Hello, my name is Johnperson.age = 35; // 修改对象的属性
console.log(person.age); // 35person.city = 'New York'; // 添加新的属性
console.log(person.city); // New Yorkdelete person.age; // 删除对象的属性
console.log(person); // {name: "John", greet: ƒ, city: "New York"}
构造函数创建对象
- 构造函数创建对象是指通过定义一个函数,并将属性和方法赋值给它,然后通过new关键字来调用该函数,创建出一个对象。
// 创建一个构造函数
function Person(name, age) {this.name = name;this.age = age;this.greet = function() {console.log(`Hello, my name is ${this.name}`);};}// 创建一个对象const person1 = new Person('John', 30); // 使用 new 来实例化const person2 = new Person('Mary', 25);// 访问对象的属性console.log(person1.name); // Johnconsole.log(person2.age); // 25// 调用对象的方法person1.greet(); // Hello, my name is Johnperson2.greet(); // Hello, my name is Mary// 验证person1和person2是否是同一个对象console.log(person1 === person2); // false
- 构造函数创建对象时,每次调用构造函数都会创建一个新的对象。因此,person1和 person2是两个不同的对象。
对象遍历
- 对象可以被遍历,可以遍历对象的属性和方法。
// 遍历对象属性
for (let key in person) {console.log(key); // name, age, greet key是属性名, 字符串类型console.log(person[key]); // John, 30, ƒ(){} person[key]是属性值
}// 遍历对象方法
for (let key in person) {if (typeof person[key] === 'function') {console.log(key); // greet}
}
对象数组
- 对象数组是指一个数组中包含多个对象。
// 创建一个对象数组
let people = [{name: 'John', age: 30},{name: 'Mary', age: 25},{name: 'Tom', age: 20}
];// 遍历对象数组
for (let i = 0; i < people.length; i++) {console.log(people[i].name); // John, Mary, Tom
}// 遍历对象数组的属性
for (let i = 0; i < people.length; i++) {for (let key in people[i]) {console.log(key); // name, age}
}// 遍历对象数组的属性和方法
for (let i = 0; i < people.length; i++) {for (let key in people[i]) {if (typeof people[i][key] === 'function') {console.log(key); // greet} else {console.log(key); // name, age}}
}
内置对象
Math对象
- Math对象是JavaScript的内置对象,它提供了一些常用的数学函数。
// 计算平方根
console.log(Math.sqrt(9)); // 3// 计算绝对值
console.log(Math.abs(-3)); // 3// 计算最大值
console.log(Math.max(3, 5, 1)); // 5// 计算最小值
console.log(Math.min(3, 5, 1)); // 1// 计算随机数 左闭右开 [0, 1)
console.log(Math.random()); // 0.123456789console.log(Math.floor(Math.random() * (10 + 1))); // 随机生成10(包括10)以内的整数// 在数组中随机抽取元素
let arr = [1, 2, 3, 4, 5];
console.log(arr[Math.floor(Math.random() * arr.length)]); // 随机抽取数组中的一个元素// 生成n到m的随机整数
console.log(Math.floor(Math.random() * (m - n + 1)) + n); // 随机生成n到m的整数// 计算圆周率
console.log(Math.PI); // 3.141592653589793// 向上取整
console.log(Math.ceil(3.2)); // 4// 向下取整
console.log(Math.floor(3.8)); // 3// 四舍五入 在计算负数时, .5取大的, .5以上取小的
console.log(Math.round(3.5)); // 4
Date对象
- Date对象是JavaScript的内置对象,它提供了日期和时间处理函数。
// 创建一个日期对象
let date = new Date();// 格式化日期
console.log(date.toLocaleString()); // 2021/10/12 下午10:15:30// 获取日期
console.log(date.getDate()); // 12// 获取月份
console.log(date.getMonth()); // 9// 获取年份
console.log(date.getFullYear()); // 2021// 日期加减
let newDate = new Date(date.getTime() + 1000 * 60 * 60 * 24); // 加一天
console.log(newDate.toLocaleString()); // 2021/10/13 下午10:15:30let newDate = new Date(date.getTime() - 1000 * 60 * 60 * 24); // 减一天
console.log(newDate.toLocaleString()); // 2021/10/11 下午10:15:30
相关文章:
JavaScript 基础
JS概念 JS基础概念 JS是一种运行在客户端(浏览器)的编程语言, 实现人机交换结果 作用: 网页特效表单验证数据交互服务端编程(node.js) JS的组成 ECMAScript—javaScript语言基础Web APIs—(DOM: 页面文档对象模型)(BOM: 浏览器对象模型) JS书写 位置 内部: 写到< /body…...
Vibe Coding: 优点与缺点
如果你最近在开发圈子里,你很可能听说过这个新趋势"vibe coding"(氛围编程)。 我只能说我对此感受复杂。以下是原因。 优势 在构建新项目时,靠着氛围编程达到成功感觉很自由!但对于遗留代码来说情况就不同了,尽管也不是不可能。 实时反馈和快速迭代 Cursor(…...
小动物听力评价系统基本原理简析
小动物听力评价系统是用于评估小动物听力功能的专业设备,以下从系统组成、工作原理、评价方法等方面为你介绍: 一 系统组成 声音刺激模块:能产生不同频率、强度和类型的声音信号,如纯音、啭音、短声等,以刺激小动物的听…...
spark缓存-persist
存储级别指定 persist:可以通过传入 StorageLevel 参数来指定不同的持久化级别。常见的持久化级别有: MEMORY_ONLY:将 RDD 以 Java 对象的形式存储在 JVM 的内存中。若内存不足,部分分区将不会被缓存,需要时会重新计算…...
树初步 #1(插排串联 - 辽宁省2024CCPC)
树初步 数的基础内容可以看看树基础 - OI Wiki里面的讲解,对一些操作的基础概念介绍的很清楚; 下面直接来看例题: 插排串联 - 辽宁省CCPC 题目大意 给定一个n1个节点的有根数; 根节点(0号)是插座&…...
CDGP重点知识梳理(82个)
目 录 考点分布 考试要求 第一章 数据管理-5%...
shell脚本基础详细学习(更新中)
shell简单介绍 Shell不仅仅是充当用户与UNIX或者localhost交互的角色,还可以作为一种程序设计 语言来使用。通过Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。 如果有一系列经常需要使用的命令,把它存储在一…...
记录一下学习kafka的使用以及思路
下面这是kafka的依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId></dependency> 我在学习的时候直接导入是没有导入成功的,我猜测大概的原因是我本…...
AT9880B北斗单模卫星定位SOC芯片
AT9880B是一款高性能北斗单模卫星导航接收机SOC单芯片,芯片集成射频前端和数字基带、北斗多频卫星信号处理引擎、电源管理功能。芯片支持接收中国北斗二号和北斗三号,支持接收B1I、B1C、B2I、B3I、B2a和 B2b等频点信号。 主要特性: 支持北斗…...
李沐《动手学深度学习》 | 多层感知机
文章目录 感知机模型《深度学习入门》的解释训练感知机损失函数的选择感知机的收敛定理:什么时候能够停下来,是不是真的可以停下来感知机的不足 多层感知模型案例引入隐藏层从线性到非线性单隐藏层-单分类案例多隐藏层 激活函数softmax函数溢出的问题 多…...
vue数据可视化开发常用库
一、常用数据可视化库 1. ECharts 特点:功能强大,支持多种图表类型,社区活跃。适用场景:复杂图表、大数据量、3D 可视化。安装:npm install echarts示例:<template><div ref"chart" c…...
CAN转ModbusTCP网关:破解电池生产线设备协议壁垒,实现全链路智能互联
在电池生产的现代工艺中,自动化和信息化水平的提高是提升产能、保障品质与安全的关键。CAN 协议作为一种广泛应用于汽车、工业控制等领域的串行通信协议,它以其高可靠性和强实时性而受到企业的青睐。而在众多工业通讯协议中,ModbusTCP作为一种…...
更新 / 安装 Nvidia Driver 驱动 - Ubuntu - 2
如果按更新 / 安装 Nvidia Driver 驱动 - Ubuntu-CSDN博客中的步骤操作后问题依旧,则查看过程中的提示信息。 如果发现有“Use sudo apt autoremove to remove them.”,则执行: #sudo apt autoremove #nvidia-smi...
技术分享 | 如何在2k0300(LoongArch架构)处理器上跑通qt开发流程
近期迅为售后团队反馈,许多用户咨询:2K0300处理器采用了LA264处理器核,若要在该处理器上运行Qt程序,由于架构发生了变化,其使用方法是否仍与ARM平台保持一致? 单纯回答‘一致’或‘不一致’缺乏说服力&…...
ubuntu 24.04 error: cannot uninstall blinker 1.7.0, record file not found. hint
最近在打python3.12的镜像,安装browser-gym的核心库,编译一个使用browswer agents的环境,然后出现了下面的问题: error: cannot uninstall blinker 1.7.0, record file not found. hint: the package was installed by debian.系…...
学习记录:DAY28
DispatcherController 功能完善与接口文档编写 前言 没什么动力说废话了。 今天来完善 DispatcherController 的功能,然后写写接口文档。 日程 早上:本来只有早八,但是早上摸鱼了,罪过罪过。下午:把 DispatcherContro…...
C# 的异步任务中, 如何暂停, 继续,停止任务
namespace taskTest {using System;using System.Threading;using System.Threading.Tasks;public class MyService{private Task? workTask;private readonly SemaphoreSlim semaphore new SemaphoreSlim(0, 1); // 初始为 0,Start() 启动时手动放行private read…...
html object标签介绍(用于嵌入外部资源通用标签)(已不推荐使用deprecated,建议使用img、video、audio标签)
文章目录 HTML <object> 标签详解基本语法与核心属性关键属性解析1. **data**2. **type**3. **width & height**4. **name** 嵌入不同类型的资源1. **嵌入图像**2. **嵌入音频**3. **嵌入视频**4. **嵌入 PDF** 参数传递与回退内容**参数(<param>&a…...
专题练习1
优化: 找101-200的质数: 开发验证码: 解密数字 抽奖 优化 彩票...
Uniapp编写微信小程序,使用canvas进行绘图
一、canvas文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial 二、数据绘制(单位是像素): 1、绘制文本: 文字的长度超过设置的最大宽度,文字会缩在一起 ① 填充文本…...
Java高频基础面试题
Java高频基础面试题 Java基础 Java的特点是什么? 面向对象平台无关性(“一次编写,到处运行”)支持多线程自动内存管理(垃圾回收)安全性丰富的类库 JDK、JRE和JVM的区别 JDK (Java Development Kit): Java…...
U9C-SQL-采购订单视图
U9C-SQL-采购订单视图 SELECTpo.ID,CONVERT ( VARCHAR ( 10 ), po.CreatedOn, 23 ) AS 签订日期,org.Name AS 甲方,po.DocNo AS 单号,item.Code AS 料号,item.Name AS 品名,item.SPECS AS 规格,item.DescFlexField_PrivateDescSeg1 AS 图号,item.DescFlexField_PrivateDescSeg2…...
HTML字符串转换为React元素实现
HTML字符串安全转换为React元素的实现 一、背景介绍 介绍HTML字符串在Web开发中的常见场景。说明React中直接使用HTML字符串的局限性。提出将HTML字符串转换为React元素的需求。 二、首先必备的两个npm库:html-react-parser和dompurify 导入: pnpm i…...
全局异常未能正确捕获到对应的异常
自定义Validation验证器遇到的问题 抛出的异常没有能被指定的TaskValidException.class方法拦截到。故写这个原因 全局异常拦截只能拦截相同的异常。只能通过解析转入自定义的异常。自定义的异常继承的异常要是一家子的。如TaskValidException和ValidationException。这样就能在…...
LeetCode 解题思路 47(最长回文子串、最长公共子序列)
解题思路: dp 数组的含义: dp[i][j] 是否为回文子串。递推公式: dp[i][j] s.charAt(i) s.charAt(j) && dp[i 1][j - 1]。dp 数组初始化: 单字符 dp[i][i] true,双字符 dp[i][i 1] s.charAt(i) s.charA…...
P11369 [Ynoi2024] 弥留之国的爱丽丝(操作分块,DAG可达性trick)
真的神仙题。感觉学到了很多。 题意: 给你一张 n n n 个结点 m m m 条边的有向图,点编号为 1 , 2 , … , n 1,2,\dots,n 1,2,…,n。每条边的颜色为黑色或白色。一开始所有 m m m 条边都是黑色的。 你需要进行 q q q 次操作,有两种操作…...
NAT穿越
概述 IPSec协商是通过IKE完成--->ISAKMP协议完成--->由UDP封装,源目端口均为500。 NAT--->NAPT,同时转换IP和端口信息。 对端设备会查验收到的数据报文中的源IP和源端口,其中源IP可以设定为NAT转换后的IP,但是源端口无法…...
不黑文化艺术学社首席艺术家孙溟㠭浅析“雪渔派”
孙溟㠭浅析“雪渔派” 何震 字主臣 ,长卿,号雪渔,安徽婺源(今江西)人,是明代著名的篆刻家和书法家,与文彭独树一帜,实现书法与刀法的统一。 云中白鹤 笑谭间气吐霓虹 边款 其篆刻吸…...
【Linux操作系统】第一弹——Linux基础篇
文章目录 💡 一. Linux的基本常识🪔 1.1 linux网络连接三种方式🪔1.2 虚拟机的克隆🪔1.3 虚拟机的快照🪔1.4 虚拟机的迁移和删除🪔1.5 vmtools工具 💡二. Linux的目录结构🪔2.1 Linu…...
“ES7+ React/Redux/React-Native snippets“常用快捷前缀
请注意,这是一个常用的列表,不是扩展提供的所有前缀。最完整和最新的列表请参考扩展的官方文档或在 VS Code 中查看扩展的详情页面。 React (通常用于 .js, .jsx, .ts, .tsx): rfce: React Functional Component with Export Defaultrafce: React Arro…...
selenium替代----playwright
安装 好处特点:这个东西不像selenium需要固定版本的驱动 pip config set global.index-url https://mirrors.aliyun.com/pypi/simplepip install --upgrade pippip install playwright playwright installplaywright install ffmpeg (处理音视频的)验证&#x…...
2025年社交APP安全防御指南:抵御DDoS与CC攻击的实战策略
2025年,社交APP的用户规模与业务复杂度持续增长,但随之而来的DDoS与CC攻击也愈发隐蔽和智能化。攻击者通过AI伪造用户行为、劫持物联网设备,甚至利用区块链漏洞发起混合攻击,对平台稳定性与用户数据安全构成严峻挑战。本文将结合最…...
PHP会话技术
第十六章-PHP会话技术 PHP会话技术是构建动态、个性化Web应用的核心机制之一,它通过跟踪用户在网站上的连续操作状态,实现了网页间的数据持久化交互。无论是电商平台的购物车信息保存、社交媒体的用户登录状态维持,还是表单数据的跨页面传递…...
QT聊天项目DAY10
1.封装redis操作类 头文件 #ifndef REDISMANAGE_H #define REDISMANAGE_H#include "Singletion.h" #include "GlobalHead.h"class RedisManage : public Singletion<RedisManage> {friend class Singletion<RedisManage>; public:~RedisMana…...
5.0.5 变换(旋转、缩放、扭曲)
WPF变换可以产生特殊效果,如平移、旋转、扭曲。 变换类 描述TranslateTransform沿着X轴和Y轴平移ScaleTransform 沿着定义的中心点缩放RotateTransform沿着定义的中心点旋转SkewTransform 扭曲元素MatrixTransfrom提供3x3矩阵,用于定义一个自定义变换 1…...
matlab转python
1 matlab2python开源程序 https://blog.csdn.net/qq_43426078/article/details/123384265 2 网址 转换网址:https://app.codeconvert.ai/code-converter?inputLangMatlab&outputLangPython 文件比较网址:https://www.diffchecker.com/text-comp…...
什么是直播美颜SDK?跨平台安卓、iOS美颜SDK开发实战详解
时下,尤其在社交、娱乐、电商等应用场景中,一个流畅且效果自然的美颜功能往往能直接影响用户的留存率和平台的营收。要实现这些效果,美颜SDK是核心工具。那么,什么是直播美颜SDK?它的功能有哪些?如何进行跨…...
大尺寸PCB如何重塑通信与新能源产业格局
在5G通信基站与新能源电站的机房内,一块块面积超过600mm600mm的PCB板正悄然推动着技术革命。作为电子设备的核心载体,大尺寸PCB凭借其高密度集成与复杂工艺,成为通信、能源等领域的“隐形功臣”。以猎板PCB为代表的厂商,凭借宽幅曝…...
JavaSE核心知识点02面向对象编程02-04(包和导入)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点02面向对象编程02-04&#…...
【漫话机器学习系列】249.Word2Vec自然语言训练模型
【自然语言处理】用 Word2Vec 将词语映射到向量空间详解 一、背景介绍 在自然语言处理(NLP)领域,我们常常需要将文本信息转化为机器能够理解和处理的形式。传统的方法,如 one-hot编码,虽然简单,但存在严重…...
CSS transition过渡属性
transition 是 CSS 中用于创建平滑动画效果的属性,它允许元素在两个状态之间平滑过渡,而不是立即改变。通过定义过渡的属性、持续时间和速度曲线,你可以实现丰富的交互体验,如悬停效果、状态切换动画等。 核心作用 平滑过渡&…...
U9C对接飞书审批流完整过程
U9C虽然很强大,但是移动办公和审批流功能并不好用,为了弥补U9C这种不足,很多的企业在使用U9C的同时再开通钉钉、飞书、企业微信这种OA管理系统,两套系统并行使用,就需要考虑U9C和OA系统数据同步的问题,最简…...
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
作者:裘文成(翊韬) 摘要 随着企业全球化业务的扩展,如何高效、经济且可靠地将分布在海外各地的应用与基础设施日志统一采集至阿里云日志服务 (SLS) 进行分析与监控,已成为关键挑战。 本文聚焦于阿里云高性能日志采集…...
从0开始学习大模型--Day04--大模型的框架以及基本元素
Agent框架与策略分析 计划与执行(planning-and-Execute) 该框架侧重于先规划一系列的行动,然后执行。这个框架可以使大模型能够先综合考虑任务的多个方面,然后按照计划进行行动,比较适合应用在较复杂的项目管理中或者…...
FPGA实战项目2———多协议通信控制器
1. 多协议通信控制器模块 (multi_protocol_controller) 简要介绍 这是整个设计的顶层模块,承担着整合各个子模块的重要任务,是整个系统的核心枢纽。它负责协调 UART、SPI、I2C 等不同通信协议模块以及 DMA 模块的工作,同时处理不同时钟域之间的信号交互,确保各个模块能够…...
strings.Builder 使用详解
目录 1. 官方包 2. 支持版本 3. 官方说明 官方示例 方法 func (b *Builder) Cap() int func (b *Builder) Grow(n int) func (b *Builder) Len() int func (b *Builder) Reset() func (b *Builder) String() string func (b *Builder) Write(p []byte) (int, error)…...
数巅智能携手北京昇腾创新中心深耕行业大模型应用
当前,AI技术正在加速向各行业深度渗透,成为驱动产业转型和社会经济发展的重要引擎。构建开放协作的AI应用生态体系、推动技术和应用深度融合,已成为行业发展的重要趋势。 近日,数巅智能与北京昇腾人工智能计算中心(北京昇腾创新中…...
【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识——⑤电源及电路设计
文章目录 7. 嵌入式系统电源分类及管理7.1 嵌入式系统电源分类7.2 电源管理技术7.3 电源完整性设计 8. 电子电路设计8.1 电子电路设计基础知识8.1.1 电子电路设计原理8.1.2 电子电路设计方法及步骤8.1.3 电子电路可靠性设计 8.2 PCB设计基础知识8.2.1 PCB设计原理8.2.2 PCB设计…...
排序算法-希尔排序
希尔排序是插入排序的改进版,通过将原始数组分成多个子序列进行间隔插入排序,逐步缩小间隔直至为1,最终完成整体排序。它也被称为缩小增量排序。 希尔排序步骤 选择增量序列(Gap Sequence):确定一个递减的…...
JAVA继承中变量和方法的存储和方法中访问变量的顺序
一、变量归属与内存位置 static 变量:属于类,只存在一份,保存在方法区(或元空间)。 实例变量(非static):属于对象,每个对象单独一份,保存在堆内存中。 二、…...