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

前端基础知识

1. 变量和常量

1.1 变量

        // 变量let name = 'Jack'let age = 20name = 'lisi'age = 18

1.2 常量

        // 常量const PI = 3.14// PI = 3.1415926 // error,常量不可重新赋值const articleList = []const user = {name: 'vue3',age: 10}

1.3 const 声明的数组和对象

因为数组和对象在 JS 中属于引用类型,对其做添加、删除等操作,并不改变其内存地址,所以可以对其进行修改

        // 数组const arr = [1, 2, 3]// 添加arr.push(4)// 删除arr.shift()console.log(arr)// 对象const obj = {name: 'lisi',age: 10}// 添加属性obj.birth = 2015console.log(obj)// 修改属性obj.age = 18console.log(obj)

运行结果:

2. 模版字符串

2.1 普通字符串

用一对单引号或双引号声明,基本上都是用单引号

        // 普通字符串let name = 'Jack'let msg = "Hello World"

2.2 模版字符串

用一对反引号声明

        // 模版字符串let name = `Jack`let msg = `Hello World`

2.3 模版字符串的优势

2.3.1 可任意换行

        let htmlStr = '<div class="hot-goods-box"><h1>热门商品</h1><p>卖爆了卖爆了卖爆了</p></div>'let htmlStr = `<div class="hot-goods-box"><h1>热门商品</h1><p>卖爆了卖爆了卖爆了</p></div>`

2.3.2 可嵌入表达式

避免了繁琐的 加号 做字符串拼接

嵌入语法:${表达式}

        let name = 'lisi'let age = 9// let str = 'My name is xxx, I am xxx years old, I am 已成年 or 未成年'// let str = 'My name is ' + name + ', I am ' + age + ' years old, I am ' + (age >= 18 ? '已成年' : '未成年')let str = `My name is ${name}, I am ${age} years old, I am ${age >= 18 ? '已成年' : '未成年'}`console.log(str)

运行结果:

3. 对象

3.1 取值

3.1.1 点取值

        const obj = {name: 'lisi',age: 18}// 点取值console.log(obj.name)console.log(obj.age)

3.1.2 中括号取值

        const obj = {name: 'lisi',age: 18}// 中括号取值console.log(obj['name'])console.log(obj['age'])

 3.1.3 特殊情况

当属性名是变量的时候,只能用中括号取值

        let x = 'name'let y = 'age'console.log(obj[x])console.log(obj[y])console.log(obj.x) // undefinedconsole.log(obj.y) // undefined

若此时还用 点取值,不会报错,但是会显示 undefined

运行结果:

3.2 简写

3.2.1 属性

当属性名和属性值的名字相同时,可以只写一个,通常会配合变量使用

        let min = 1let max = 99// 不简写const obj = {min: min,max: max}// 简写const obj = {min,max}

3.2.2 方法

        const obj = {// 不简写fn: function() {}}// 上面写法和下面写法是等价的const obj = {// 简写:连同 : 和 function 一起省略fn() {}}

4. 解构赋值

针对目标:数组 或对象

作用:让数组和对象的取值更加便捷

4.1 代码示例

1. 数组解构

        const arr = [11, 22, 33]// eg1:把 arr 中的三个元素分别赋值给变量 a, b, c// 数组下标实现:let a = arr[0]let b = arr[1]let c = arr[2]// 解构实现:let [a, b, c] = arrconsole.log(a, b, c) // 运行结果:11 22 33// eg2:把 arr 中的后两个元素分别赋值给变量 b, clet [, b, c] = arrconsole.log(b, c) // 运行结果:22 33// eg3:把 arr 中的第一个元素赋值给变量 a,第三个元素赋值给变量 clet [a, , c] = arrconsole.log(a, c) // 运行结果:11 33// eg4:把 arr 的第一个元素赋值给变量 a,剩余的全部给变量 restlet [a, ...rest] = arrconsole.log(a, rest) // 运行结果:(2) [22, 33]// eg5:把下面 arr 中的 3, 4 赋值给变量 a, bconst arr = [2, [3, 4], 5]let [, [a, b]] = arrconsole.log(a, b) // 运行结果:3 4

2. 对象解构

        const obj = {name: '胡图图',age: 3,address: '翻斗大街翻斗花园 2 号楼 1001 室'}// eg1:把 obj 的 3 个属性分别赋值给变量 name, age, address// 点赋值方式let name = obj.namelet age = obj.agelet address = obj.address// 解构方式let {age, name, address} = objconsole.log(name, age, address) // 运行结果:胡图图 3 翻斗大街翻斗花园 2 号楼 1001 室// eg2:把 obj 的 name, age 属性值赋值给变量 name, agelet {name, age} = objconsole.log(age, name) // 运行结果:3 '胡图图'//eg3:把 obj 的 name 属性值赋值给变量 name,剩余的赋值给变量 restlet {name, ...rest} = objconsole.log(name, rest)// eg4:把 obj 的 name 属性值赋值给 unamelet {name: uname} = objconsole.log(uname) // 运行结果:胡图图// eg5:把下面 obj 中的 code, message, result 的值取出来赋值给变量 code, message, listconst obj = {data: {code: 10000,message: '频道列表获取成功',result: ['HTML', 'CSS', 'JavaScript', 'Vue', 'SpringBoot']},status: 200,statusText: 'Ok'}// 解构拿到 dataconst {data} = objconsole.log(data)// 再解构 dataconst {code, message, result: list} = dataconsole.log(code, message, list)

5. 箭头函数

5.1 非箭头函数

        // 有名函数function fn() {// some code...// return 结果}// 函数表达式const fn = function() {}// 执行const result = fn()

5.2 箭头函数语法

        const fn = () => {}// 两数相加const add = (x, y) => {return x + y}const result = add(1, 1)console.log(result) // 运行结果:2

5.3 箭头函数特点

1. 当参数只有一个时,可以省略小括号

        // const log = (arg) => { // 等价于下面写法const log = arg => {console.log(arg)}log(666) // 运行结果:666log('箭头函数') // 运行结果:箭头函数

2. 当函数体只有一句话时,可以省略大括号,此时箭头函数自带 return 功能

        const add = (x, y) => {return x + y}// 上面等价于下面const add = (x, y) => x + yconsole.log(add(1, 2))

3. 当直接返回一个对象时,为了简写,需要给对象加一对小括号

        const state = () => {return {token: 'xxx',userInfo: {name: 'admin',id: 1}}}// 上面等价于下面const state = () => ({token: 'xxx',userInfo: {name: 'admin',id: 1}})console.log(state())

5.4 应用

可用于普通函数的声明,也多用于回调函数传参

        // 延时函数setTimeout(function() {console.log(666)}, 2000)// 用箭头函数简写如下setTimeout(() => {console.log(666)}, 2000)

6. 数组的重要方法

数组:用来存放相同类型的一组数,管理一组有序数据的集合

6.1 添加 push() 和 unshift()

        const arr = [11, 22, 33]// 添加const len = arr.push(44) // 尾部添加console.log(arr, len) // 运行结果:[11, 22, 33, 44] 4const len = arr.unshift(44) // 头部添加console.log(arr, len) // 运行结果:[44, 11, 22, 33] 4

6.2 删除 pop() 和 shift()

        const arr = [11, 22, 33]// 删除const last = arr.pop() // 尾部删除console.log(arr, last) // 运行结果:[11, 22] 33const first = arr.shift() // 头部删除console.log(arr, first) // 运行结果:[22, 33] 11

6.3 任意位置删除或添加 splice(startIndex, delCount, ...addItem)

  • startIndex:起始下标(从哪开始操作)
  • delCount:删除元素的个数
  • addItem:要添加的元素
        const arr = [11, 22, 33]const temp = arr.splice(1, 1) // 从下标为 1 的位置开始删除,共删除 1 个元素console.log(arr, temp) // 运行结果:[11, 33] [22]arr.splice(2, 0, 44) // 从下标为 2 的位置,删除 0 个元素,添加元素:44console.log(arr) // 运行结果:[11, 22, 44, 33]

6.4 包含 includes()

包含返回 true,否则返回 false,通常配合 if 语句做判断

        const arr = [11, 22, 33]// 包含console.log(arr.includes(33)) // trueconsole.log(arr.includes(55)) // false

6.5 遍历 forEach()

        const arr = [11, 22, 33, 44]// for 循环遍历for (let i = 0; i < arr.length; i++) {console.log(arr[i])}// forEach 循环遍历const result = arr.forEach((item, index, array) => {// item:每次遍历的元素// index:当前元素在数组中的下标// array:遍历数组本身console.log(item, index, array)})console.log(result) // 注意:forEach() 只遍历数组,只是对 for 循环的简化而已,无返回值

6.6 过滤/筛选 filter()

保留满足条件的,去掉不满足条件的

        const arr = [11, 22, 33, 44]arr.filter((item, index, array) => {// 内部会遍历数组,每遍历一次都会执行回调一次// 如果返回 true,则当前元素会保留,否则去掉return 布尔值})// 需求:留下 arr 中所有的偶数const evenArr = arr.filter((item) => {if (item % 2 === 0) { // 使用全等号(===),比 == 效率高,不会发生隐式类型转换return true} else {return false}})// 简化后:const evenArr = arr.filter((item) => {return item % 2 === 0})// 进一步简化const evenArr = arr.filter((item) => item % 2 === 0)console.log(evenArr) // 运行结果:[22, 44]// 需求:留下 arr 中大于 30 的数const filterArr = arr.filter((item) => item > 30)console.log(filterArr) //运行结果:[33, 44]

6.7 映射 map()

由一个数组得到另一个数组,二者满足两个条件:

  1. 两个数组长度一致(元素个数一致)
  2. 新数组中的每个元素可以由原数组中的每个元素一一得到
        const arr = [11, 22, 33, 44]// 语法arr.map((item, index, array) => {return 新值})// 需求:得到每个元素翻倍的新数组:[22, 44, 66, 88]const doubleArr = arr.map((item) => {return item * 2})// 简写:const doubleArr = arr.map((item) => item * 2)console.log(doubleArr) // 运行结果:[22, 44, 66, 88]// 需求:得到如下对象数组// [//     { index: 0, value: 11 },//     { index: 1, value: 22 },//     { index: 2, value: 33 },//     { index: 3, value: 44 }// ]const newArr = arr.map((value, index) => {return {index,value}})// 简写:const newArr = arr.map((value, index) => ({ index, value }))console.log(newArr)

6.8 检测每一个 every()

        const arr = [11, 22, 33, 44]// 语法// arr.every((item, index, array) => {//     // 1. 如果返回 true,说明当前元素满足条件,则继续检测下一次,若都满足条件,则最终返回 true//     // 2. 如果返回 false,说明当前元素不满足条件,立即停止检测,最终返回 false//     return 布尔值// })// 需求:判断 arr 中元素是否都为奇数const flag = arr.every((item) => item % 2 ===1)console.log(flag)// 需求:检测 arr 中的数是否都大于 10const flag = arr.every((item) => item > 10)console.log(flag)

6.9 汇总 reduce()

常用语数组求和,但不限于求和

        const arr = [11, 22, 33, 44]// 语法(有两个参数,第一个是回调函数,第二个是初始值)const result = arr.reduce((prev, item, index, array) => {return 结果}, 初始值)// 需求:遍历求和// forEach 方式:let sum = 0arr.forEach(item => {sum += item})console.log(sum)// reduce 方式:arr.reduce((prev, item, index, array) => {// prev 第一次的初始值就是 reduce 的第二个参数 0// 后面再进入回调函数,prev 的值是上一次回调函数的返回值// 若上一次回调函数无返回值,则 prev 就是 undefinedconsole.log(prev, item, index, array)return prev + item}, 0)// 简写:const sum = arr.reduce((prev, item) => prev + item, 0)console.log(sum)// 商品列表数组const goodsList = [{ id: 1, name: '篮球', num: 1 },{ id: 2, name: '玩具', num: 3 },{ id: 3, name: '书籍', num: 2 }]// 需求:求总数量const totalNum = goodsList.reduce((prev, item) => prev + item.num, 0)console.log(totalNum)

7. 对象的重要方法

Object.keys()

用来获取对象的键的数组,从而可以很灵活的遍历对象(遍历对象的每一对键值对)

        const obj = {id: 100001,name: '胡图图',age: 3,address: '翻斗大街翻斗花园 2 号楼 1001 室'}// 使用 for-in 遍历对象for (let key in obj) {// console.log(key, typeof key) // typeof 可以判断当前 key 是什么类型console.log(key, obj[key]) // tip:此处 key 是变量,只能使用 [] 取值,且不能加引号}// 使用 Object.keys() + forEach() 遍历对象Object.keys(obj).forEach((key) => {console.log(key, obj[key])})// Object.keys() 返回的是数组,我们可以对数组进行很多操作之后,再进行遍历对象,更灵活,更强大// 需求:只遍历 obj 中以字母 a 开头的属性Object.keys(obj).filter((key) => key.startsWith('a')) // 过滤掉首字母不是 a 的 key.forEach(key => {console.log(key, obj[key])})

8. 扩展运算符 ...

作用:

  1. 在解构赋值时,用于收集余下所有的
  2. 复制数组或对象
  3. 合并数组或对象

8.1 复制数组或对象

        // 复制数组或对象,复制,也叫做拷贝/克隆/备份const arr1 = [11, 22, 33]const arr2 = arr1 // 这是引用,不是复制,两者会相互影响(因为其指向的是同一个地址)arr2.push(44) // 修改了 arr2,arr1 也会被修改console.log(arr1) // 运行结果:[11, 22, 33, 44]const arr2 = [...arr1] // 把 arr1 复制一份给 arr2,二者值相同,但地址不同,相互独立arr2.push(44)console.log(arr1) // [11, 22, 33]// 复制对象const obj1 = {id: 100001,name: '胡图图',age: 3,}const obj2 = {...obj1}obj2.age = 10console.log(obj1) // 运行结果:{id: 100001, name: '胡图图', age: 3}console.log(obj2) // 运行结果:{id: 100001, name: '胡图图', age: 10}

8.2 合并数组或对象

        // 合并数组const arr1 = [1, 2, 3]const arr2 = [4, 5, 6]const arr = [...arr1, ...arr2]console.log(arr) // 运行结果:[1, 2, 3, 4, 5, 6]// 合并对象const obj1 = {name: 'Jack',height: 178}const obj2 = {height: 180,age: 18}const obj = {...obj1,...obj2 // 此处 obj2 中的 height 会覆盖掉 obj1 中的 height}console.log(obj) // 运行结果:{name: 'Jack', height: 180, age: 18}

9. 序列化和反序列化

9.1 序列化

序列化:把对象转换为 json 格式字符串

json 格式:是一种严格的对象表示法,体现在 json 格式数据的属性名必须用双引号;若存在字符串类型必须用双引号

        // 普通对象const obj = {id: 10001,name: '胡图图',age: 3}// json 格式const json = {"id": 10001,"name": "胡图图","age": 3}// 序列化语法// JSON.stringify(对象)console.log(JSON.stringify(obj))

9.2 反序列化

反序列化:把 json 字符串转换为对象

        // json 字符串const jsonStr = '{"id": 10001, "name": "胡图图", "age": 9}'// 反序列化console.log(JSON.parse(jsonStr))

10. Web 存储

10.1 介绍

Web Storage 包含如下两种机制:

1. sessionStorage 该存储区域在页面会话期间可用(即只要浏览器处于打开状态,包含页面重新加载和恢复)

  • 仅为会话存储数据,这意味着数据将一直存储到浏览器(或选项卡)关闭
  • 数据永远不会被传输到服务器
  • 存储限额大于 Cookie(最大 5MB)

2. localStorage 即使浏览器关闭并重新打开也仍然存在

  • 存储的数据没有过期日期,只能通过 JavaScript、请求浏览器缓存或本地存储的数据来清除

10.2 用法

以 localStrorage 为例,学习存、取、删

1. 存

        // 存localStorage.setItem(key:string, value:string)// eglocalStorage.setItem('uname', 'lisi')// 存对象和数组,需要序列化

2. 取

        // 取// 如果存在 key,则取出相应的数据;否则取值为 null(表示 key 不存在)localStorage.getItem(key:string)// egconsole.log(localStorage.getItem('uname'))// 取出对象和数组,需要反序列化

3. 删

        // 删localStorage.removeItem(key:string)localStorage.removeItem('uname')

4. 注意

存储对象或数组需要进行序列化和反序列化

        const obj = {id: 10001,name: '胡图图',age: 9}// 存:序列化localStorage.setItem('胡图图', JSON.stringify(obj))// 取:反序列化console.log(JSON.parse(localStorage.getItem('胡图图')))

11. Promise + Aysnc/Await

11.1 为什么需要 Promise

为了消除回调地狱

        // 需求:延迟 2 秒输出 1,完了之后延迟 1 秒输出 2,完了之后延迟 1 秒输出 3// 语法:两个参数,一个是回调函数,一个是延迟时间setTimeout(() => {console.log('setTimeout')}, 3000)// 实现setTimeout(() => {console.log(1)}, 2000)setTimeout(() => {console.log(2)}, 1000)setTimeout(() => {console.log(3)}, 1000)// 发现浏览器打印顺序为:2 3 1,这是因为 js 代码的执行顺序为 异步的// 同步代码:串行执行,前面的代码先执行,后面的代码后执行// 异步代码:并行执行,大家同时开始执行,后面的代码不会等待前面代码执行完毕才执行// 修改成以下代码可以完成需求:setTimeout(() => {console.log(1)setTimeout(() => {console.log(2)setTimeout(() => {console.log(3)}, 1000)}, 1000)}, 2000)// 上述代码存在的问题:回调套回调(又称回调地狱),代码的可读性差

为了消除回调嵌套,Promise 就应运而生了 

11.2 Promise 介绍

Promise 是一个类,用来包装异步操作,根据异步操作的结果,是成功还是失败,进而决定 Promise 是成功还是失败

Promise 支持链式调用,从而消除回调地狱

11.3 Promise 的 3 种状态

Pending: 进行中,此时 Promise 的状态还不确定
Fullfilled: 成功,状态确定了
Rejected: 失败,状态确定了

Promise 的状态

  1. 只能由 Pending -> Fullfilled,或 Pending -> Rejected
  2. Promise 的状态一旦确定,就不可改变了

11.4 基本使用

        // Promise 基本使用const p = new Promise((resolve, reject) => {// 如果异步操作成功了,需要调用 resolve(成功的数据)// 如果异步操作失败了,需要调用 reject(失败的原因)// 在这里进行包装异步代码,如:定时器、ajax 请求setTimeout(() => {// 调用 resolve(),表示当前 Promise 成功了// resolve('ok')reject('error')}, 2000)})p.then((msg) => { // 第一个回调表示 resolve(可传入参数)console.log('成功了', msg)}, (err) => { // 第二个回调表示 rejectconsole.log('失败了', err)})

 

11.5 消除上述回调地狱

        /*** 延迟输出的异步函数,用 Promise 进行封装* duration:延迟的时间* n:延迟输出的数*/function delay(duration, n) {return new Promise((resolve) => {setTimeout(() => {resolve(n)}, duration)})}// Promise 的链式调用消除回调地狱delay(2000, 1).then((n1) => {console.log(n1)return delay(1000, 2)}).then((n2) => {console.log(n2)return delay(1000, 3)}).then((n3) => {console.log(n3)})

上述代码虽然消除了回调地狱,但链式调用过长,也不利于阅读

为了继续优化,Aysnc + Await 就应运而生了 

11.6 Aysnc + Await 异步终极解决方案

        // Promise 封装延迟输出函数function delay(duration, n) {return new Promise((resolve) => {setTimeout(() => {resolve(n)}, duration)})}async function log() {// 1. 在 Promise 实例前添加 await 关键字,这样 await 的返回值就是 Promise 的 resolve 参数// 2. await 所在的函数必须被 async 修饰// 3. await 所在的函数会按照同步的方式进行代码的执行,也就是前面的 await 执行完毕了,才会执行后续的 awaitconst n1 = await delay(2000, 1)console.log(n1)const n2 = await delay(1000, 2)console.log(n2)const n3 = await delay(1000, 3)console.log(n3)}log()

12. 模块化

12.1 概述

模块:一个文件就是一个模块,模块=文件

模块化:一种代码的开发思想,是指将一个复杂程序划分为一系列独立、可互操作的模块的过程。每个模块负责特定的功能或任务,并通过定义好的接口与其他模块进行通信。简单来说,就是将代码进行分解、按功能进行管理。

不同模块之间需要通过导入导出的方式进行模块通信,提高代码的可维护性、可重用性、可测试性和可扩展性,让开发者能够更容易地处理大型 JavaScript 项目。

12.2 目录结构准备

1. 新建 12-es-module 目录

2. 命令行进入 12-es-module 目录

两种方式:

1)

2)

3. 执行 npm init,初始化得到 package.json 文件

 

4. 给 package.json 添加 "type": "module"

5. 根目录下新建 src/index.js 作为代码的入口文件

6. src 目录下新建 utils 目录

12.3 默认导出与导入

新建 utils/min.js

// 定义求两个数最小值的函数并默认导出
export default function min(m, n) {return m > n ? n : m
}// tip:默认导出 export default 在一个模块中最多出现 1 次

src/index.js

// 默认导入 min 函数
// 默认导入的变量名可以随便起,但为了语义化,建议和模块功能保持一致
import min from './utils/min.js'console.log(min(12, 45)) // 打印 12

tip:

12.4 按需导出与导入

新建 utils/math.js

// 定义求和函数并按需导出
export function add(x, y) {return x + y
}// 定义作差函数并按需导出
export function sub(x, y) {return x - y
}// tip:按需导出 export 在一个模块中可以出现多次

src/index.js

// 按需导入
// tip:按需导入的变量必须用花括号包起来,并且变量名和导出的变量名必须一致
import {add, sub} from './utils/math.js'console.log(add(33, 18)) // 51
console.log(sub(33, 18)) // 15

运行结果:

相关文章:

前端基础知识

1. 变量和常量 1.1 变量 // 变量let name Jacklet age 20name lisiage 18 1.2 常量 // 常量const PI 3.14// PI 3.1415926 // error&#xff0c;常量不可重新赋值const articleList []const user {name: vue3,age: 10} 1.3 const 声明的数组和对象 因为数组和对象在…...

从零到一学习c++(基础篇--筑基期十一-类)

从零到一学习C&#xff08;基础篇&#xff09; 作者&#xff1a;羡鱼肘子 温馨提示1&#xff1a;本篇是记录我的学习经历&#xff0c;会有不少片面的认知&#xff0c;万分期待您的指正。 温馨提示2&#xff1a;本篇会尽量用更加通俗的语言介绍c的基础&#xff0c;用通俗的语言去…...

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…...

C#与AI的交互(以DeepSeek为例)

C#与ai的交互 与AI的交互使用的Http请求的方式&#xff0c;通过发送请求&#xff0c;服务器响应ai生成的文本 下面是完整的代码&#xff0c;我这里使用的是Ollama本地部署的deepseek&#xff0c;在联网调用api时&#xff0c;则url会有不同 public class OllamaRequester {[Se…...

Sky Hackathon 清水湾的水 AI美食助手

这里写自定义目录标题 视频 视频 video...

基于SpringBoot的校园消费点评管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

企业财务数据分析-投资回报指标ROA

上一篇文章主要介绍了关于投资回报的核心指标ROE&#xff0c;其实还有一个比较关键的指标资产回报率指标&#xff08;ROA&#xff09;&#xff0c;资产收益率是用来衡量企业盈利能力的重要财务分析指标。资产收益率越高&#xff0c;说明企业资产的利用效率越高&#xff0c;利用…...

PostgreSQL 支持字段类型

PostgreSQL 支持多种字段类型&#xff0c;以下是常见的主要类别和具体类型的简要概述&#xff1a; 数值类型 SMALLINT&#xff1a;2字节整数&#xff0c;范围 -32768 到 32767 INTEGER&#xff1a;4字节整数&#xff0c;范围 -2147483648 到 2147483647 BIGINT&#xff1a;8字节…...

Deepseek引爆AI热潮 防静电地板如何守护数据中心安全

近期&#xff0c;Deepseek的爆火将人工智能推向了新的高度&#xff0c;也引发了人们对AI背后基础设施的关注。作为AI运行的“大脑”&#xff0c;数据中心承载着海量数据的存储、处理和传输&#xff0c;其安全稳定运行至关重要。而在这背后&#xff0c;防静电地板扮演着不可或缺…...

【ARM】MDK如何生成指定大小的bin文件,并指定空区域的填充数据

1、 文档目标 解决MDK如何生成指定大小的bin文件&#xff0c;并指定空区域的填充数据 2、 问题场景 客户有这样的需求&#xff0c;客户本身的工程编译生成bin文件后&#xff0c;bin文件大小为200k。整体芯片的内存有512k。客户想要最终生成的bin文件可以达到512k的一个情况&a…...

开源基准测试模拟器:BlueROV2 水下机器人的控制

拜读An Open-Source Benchmark Simulator: Control of a BlueROV2 Underwater Robot 非常感谢Esben Uth的帮助。 本文介绍了在 Simulink™ 中实现的常用且低成本的遥控潜水器 &#xff08;ROV&#xff09; BlueROV2 的仿真模型环境&#xff0c;该环境已针对水下航行器的基准控…...

Nginx 请求超时

Nginx 请求超时详解 在现代 Web 服务中&#xff0c;Nginx 作为一个高效的 Web 服务器和反向代理服务器&#xff0c;广泛应用于处理大量的 HTTP 请求。随着 Web 应用和服务的复杂性增加&#xff0c;Nginx 在处理客户端请求时&#xff0c;可能会出现超时问题。请求超时是指当客户…...

2022 年学习 Spring Boot 开发的最佳书籍

在我们之前的文章中&#xff0c;我们查看了学习 Java 编程的必读书籍我们在其中探索了一些您可以利用的资源来加快 Java 开发的速度。在此基础上&#xff0c;在用 vanilla Java 编写一段时间后&#xff0c;您将意识到组织文件和其他内容&#xff08;例如设置 getter 和 setter、…...

JavaScript 前端面试 5()

十&#xff1a;new操作符 1&#xff1a;new操作符是什么 在JavaScript中new操作符是用于创建一个给定构造函数的实例对象 function Person(name,age){ this.name name; this.age age; } Person.protoype.sayName function (){ console,log(this.name) } cost person1 new…...

【Jenkins】显示 HTML 标签

需求 在 Jenkins 中显示 HTML 标签内容&#xff08;例如格式化的文本、颜色、图标等&#xff09;是一个常见的需求&#xff0c;如下&#xff0c;编译工程显示当前编译的分支&#xff1a; 但 Jenkins 默认会出于安全考虑&#xff08;防止 XSS 攻击&#xff09;转义 HTML 标签&a…...

DeepSeek R1模型提示语技巧:如何高效引导AI生成优质内容

文章目录 明确任务目标提供上下文使用结构化提示指定输出格式控制输出长度调整语气和风格提供示例迭代优化提示语避免歧义结合多轮对话总结 DeepSeek R1是一款基于大规模语言模型的AI工具&#xff0c;能够生成高质量的自然语言内容。为了充分发挥其潜力&#xff0c;用户需要掌握…...

UE5从入门到精通之多人游戏编程常用函数

文章目录 前言一、权限与身份判断函数1. 服务器/客户端判断2. 网络角色判断二、网络同步与复制函数1. 变量同步2. RPC调用三、连接与会话管理函数1. 玩家连接控制2. 网络模式判断四、实用工具函数前言 UE5给我们提供了非常强大的多人网路系统,让我们可以很方便的开发多人游戏…...

NGINX配置TCP负载均衡

前言 之前本人做项目需要用到nginx的tcp负载均衡&#xff0c;这里是当时配置做的笔记&#xff1b;欢迎收藏 关注&#xff0c;本人将会持续更新 文章目录 配置Nginx的负载均衡 配置Nginx的负载均衡 nginx编译安装需要先安装pcre、openssl、zlib等库&#xff0c;也可以直接编译…...

PyTorch torch.logsumexp 详解:数学原理、应用场景与性能优化(中英双语)

PyTorch torch.logsumexp 详解&#xff1a;数学原理、应用场景与性能优化 在深度学习和概率模型中&#xff0c;我们经常需要计算数值稳定的对数概率操作&#xff0c;特别是在处理 softmax 归一化、对数似然计算、损失函数优化 等任务时&#xff0c;直接求和再取对数可能会导致…...

【多模态大模型】端侧语音大模型minicpm-o:手机上的 GPT-4o 级多模态大模型

MiniCPM-o ,它是一款 开源、轻量级 的多模态大语言模型,目标是在手机等资源受限的环境中实现 GPT-4o 级别的多模态能力! 1. MiniCPM-o:小身材,大能量! MiniCPM-o 的名字已经暗示了它的核心特点:Mini (小巧) 和 CPM (中文预训练模型),最后的 “o” 则代表 Omnimodal …...

【Java 优选算法】模拟

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 模拟算法的思路比较简单,根据题目描述列出流程,找出规律,将流程转化为代码 替换所有的问号 题目链接 解法 直接根据题目给出条件模拟 示例,找出规律 1.先找出字符?,再…...

计算机网络复习

目录 1. 前言 2.五层模型 1.应用层 2 传输层 3.网络层 4. 数据链路层 ​编辑5. 物理层 3.UDP/TCP协议 UDP协议 TCP协议 4. HTTP/HTTPS协议 1. 前言 博主目前大四, 备战春招, 复习一下计网, 大家也可以看看我的文章. 共同学习, 如有不足之处欢迎指正. 2.五层模型 在计…...

应用层的协议-http/https的状态码

1xx&#xff1a;表示临时响应&#xff0c;需要操作者继续操作 2xx&#xff1a;成功&#xff0c;操作被成功接受并处理 3xx&#xff1a;一般是重定向问题 4xx&#xff1a;客户端的问题 5xx&#xff1a;服务端的问题 1xx&#xff1a; 100: 表示服务器收到客户端的第一部分请…...

文字语音相互转换

目录 1.介绍 2.思路 3.安装python包 3.程序&#xff1a; 4.运行结果 1.介绍 当我们使用一些本地部署的语言模型的时候&#xff0c;往往只能进行文字对话&#xff0c;这一片博客教大家如何实现语音转文字和文字转语音&#xff0c;之后接入ollama的模型就能进行语音对话了。…...

C++之类型转换

目录 C语言中的类型转换 隐式类型转换 强制类型转换 C中的类型转换 static_cast reinterpret_cast const_cast dynamic_cast 本期我们将学习C中类型转换的相关知识点。 C语言中的类型转换 在C语言中&#xff0c;也有过类型转换的情景。 隐式类型转换 隐式类型转换…...

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 主机代理 配置

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 主机代理 配置 前言整体思路安装 WSL2Windows 环境升级为 WIN11 专业版启用window子系统及虚拟化 安装WSL2通过 Windows 命令提示符安装 WSL安装所需的 Linux 发行版&#xff08;如 Ubuntu 20.04&#xff09;查看…...

【数据库】【MySQL】索引

MySQL中索引的概念 索引&#xff08;MySQL中也叫做"键&#xff08;key&#xff09;"&#xff09;是一种数据结构&#xff0c;用于存储引擎快速定找到记录。 简单来说&#xff0c;它类似于书籍的目录&#xff0c;通过索引可以快速找到对应的数据行&#xff0c;而无需…...

大语言模型(LLM)提示词(Prompt)高阶撰写指南

——结构化思维与工程化实践 一、LLM提示词设计的核心逻辑 1. 本质认知 LLM是「超强模式识别器概率生成器」&#xff0c;提示词的本质是构建数据分布约束&#xff0c;通过语义信号引导模型激活特定知识路径。优秀提示词需实现&#xff1a; 精准性&#xff1a;消除歧义&#…...

LabVIEW C编译支持工具库CCompileSupp.llb

路径&#xff1a;C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\CCompileSupp.llb ​ 1. 工具库概述 定位&#xff1a;LabVIEW内置的C语言编译支持工具库&#xff0c;用于处理LabVIEW与C/C代码的混合编程接口&#xff0c;涵盖编译器配置、代码生成…...

【安装及调试旧版Chrome + 多版本环境测试全攻略】

&#x1f468;&#x1f4bb; 安装及调试旧版Chrome 多版本环境测试全攻略 &#x1f310; &#xff08;新手友好版 | 覆盖安装/运行/调试全流程&#xff09; &#x1f570;️ 【背景篇】为什么我们需要旧版浏览器测试&#xff1f; &#x1f30d; &#x1f310; 浏览器世界的“…...

整数二分算法

例题&#xff1a; 给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q个查询。 对于每个查询&#xff0c;返回一个元素 k 的起始位置和终止位置&#xff08;位置从 0开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1 -1。 输入格式 第一行…...

【java】this关键字

在 Java 中&#xff0c;this 是一个特殊的关键字&#xff0c;它代表当前对象的引用。简单来说&#xff0c;this 指向当前正在调用方法或构造函数的对象。this 关键字的主要作用是解决变量名冲突、访问当前对象的成员变量或方法&#xff0c;以及在构造函数中调用其他构造函数。 …...

LD_PRELOAD 绕过 disable_function 学习

借助这位师傅的文章来学习通过LD_PRELOAD来绕过disable_function的原理 【PHP绕过】LD_PRELOAD bypass disable_functions_phpid绕过-CSDN博客 感谢这位师傅的贡献 介绍 静态链接&#xff1a; &#xff08;1&#xff09;举个情景来帮助理解&#xff1a; 假设你要搬家&#x…...

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

MySQL后端返回给前端的时间变了(时区问题)

问题&#xff1a;MySQL里的时间例如为2025-01-10 21:19:30&#xff0c;但是返回到前端就变成了2025-01-10 13:19:30&#xff0c;会出现小时不一样或日期变成隔日的问题 一般来说设计字段时会使用datetime字段类型&#xff0c;这是一种用于时间的字段类型&#xff0c;而这个类型…...

Apache Doris:一款高性能的实时数据仓库

Apache Doris 是一款基于 MPP 架构的高性能、实时分析型数据库。它以高效、简单和统一的特性著称&#xff0c;能够在亚秒级的时间内返回海量数据的查询结果。Doris 既能支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。 Apache Doris 最初是百度广告报表业务…...

【量化-什么是信息?怎么有效的学习?关键字摘取】

到底什么是信息呢&#xff1f;我们怎么衡量信息的价值与多少呢&#xff1f;今天&#xff0c;我们就来说说这个问题。 怎么量化信息&#xff1f; 信息&#xff0c;只有量化了才能被准确地讨论&#xff0c;而量化的方法就和事件发生的概率密切相关。或者说得直白一些&#xff0…...

Java之异常体系

异常&#xff1a;异常就是代表程序出现问题 异常的继承体系&#xff1a; Error&#xff1a;严重异常&#xff0c;内存溢出等 其他异常&#xff1a;编译时异常&#xff1a;编译阶段就要进行处理的异常&#xff08;提醒程序员检查本地信息&#xff09; RuntimeException&#…...

网络运维学习笔记(DeepSeek优化版)002网工初级(HCIA-Datacom与CCNA-EI)子网划分与协议解析

文章目录 子网划分与协议解析1. VLSM与CIDR技术解析1.1 VLSM&#xff08;Variable Length Subnetwork Mask&#xff0c;可变长子网掩码&#xff09;1.2 CIDR&#xff08;Classless Inter-Domain Routing&#xff0c;无类域间路由&#xff09; 2. 子网划分方法与计算2.1 常规划分…...

【Linux知识】Linux上从源码编译到软件安装全过程详细说明

文章目录 **1. 下载源码****(1) 使用 wget 或 curl 下载****(2) 解压源码** **2. 配置编译环境****(1) 执行 ./configure 脚本**常见参数说明&#xff1a; **3. 编译源码****(1) 执行 make** **4. 安装软件****(1) 执行 make install****(2) 自定义安装路径** **5. 验证安装***…...

【尝试使用python调用Seismic unix】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、代码总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 使用seismic unix尝试建立界面&#xff0c;首先想到使用pyqt&#xff0c…...

JSON Web Token在登陆中的使用

JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用环境间安全地传递声明。它的主要用途是身份验证和信息交换。在微服务架构中&#xff0c;JWT 作为认证机制非常常见&#xff0c;特别是与 API 网关结合使用…...

CSS滚动条原理与自定义样式指南,CSS滚动条样式失效,滚动条样式无效,-webkit-scrollbar无效,overflow不显示滚动条

滚动内容形成的必要条件 CSS Overflow属性解析 MDN官方文档-Overflow属性 菜鸟教程-Overflow属性 overflow 属性控制内容溢出元素框时在对应的元素区间内是否添加滚动条。 值描述visible默认值。内容不会被修剪&#xff0c;会呈现在元素框之外。hidden内容会被修剪&#xf…...

陀螺匠·企业助手v1.8 产品介绍

陀螺匠企业助手是一套采用Laravel 9框架结合Swoole高性能协程服务与Vue.js前端技术栈构建的新型智慧企业管理与运营系统。该系统深度融合了客户管理、项目管理、审批流程自动化以及低代码开发平台&#xff0c;旨在为企业提供一站式、数字化转型的全方位解决方案&#xff0c;助力…...

【数据结构】(11) Map 和 Set

一、Map 和 Set 的简介 1、Set 和 Map Map 和 Set 是集合类框架学习的最后一部分。Map 和 Set 都是接口&#xff0c;需要通过 TreeSet、HashSet 和 TreeMap、HashMap 实例化。注意&#xff0c;Set 实现了 Collection&#xff0c;Map 并没有。 Set 存放的是键&#xff08;Key&a…...

DeepSeek 提示词:高效的提示词设计

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【Redis】在Java中以及Spring环境下操作Redis

Java环境下&#xff1a; 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…...

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;二&#xff09;配置网络与登录本地远程Linux主机 前言一、使用命令行&#xff08;nmcli 命令&#xff09;配置网络&#xff0c;配置主机名第一步第二步修改主机名称 二、使用图形化界面&#xff08;nmtui 命令&#xff09;配…...

新数据结构(13)——I/O

字符流 字符输入流&#xff08;Reader&#xff09; 字符输入流用于从数据源&#xff08;如文件、字符串等&#xff09;读取字符数据。Reader 是所有字符输入流的抽象基类。 常用实现类 FileReader 用于从文件中读取字符数据。 InputStreamReader 将字节流转换为字符流&…...

C语言学习,希尔排序

C语言&#xff0c;希尔排序是插入排序的一种&#xff0c;也称为递减增量排序。通过比较距离较远的元素&#xff0c;然后逐渐缩小间隔&#xff0c;直到整个数组变成有序的。这种排序方法减少了插入排序&#xff0c;大数据集的移动次数&#xff0c;提高了效率。 示例&#xff1a…...