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

前端基础面试题·第三篇——JavaScript(其一)

1.JavaScript数据类型与运算符

数据类型
原始数据类型:
1.Number
2.String
3.Boolean
4.undefined
5.null
6.Symbol
7.bigint

复杂数据类型:
1.Function
2.非函数:
Array: 数组
Object: 对象
Date: 日期
RegExp: 正则
Map: 映射
Set: 集合
WeakMap: 弱映射
WeakSet: 弱集合
FormData: 表单数据

判断数据类型
1.typeof 运算符 ⼀般⽤来 判断基本数据类型 ,如:string,number,boolean,symbol,bigint(es10新
增⼀种基本数据类型bigint),undefined等。返回数据类型的字符串形式
typeof ⽬前能返回string,number,boolean,symbol,bigint,unfined,object,function这⼋种判断类型,但是注意 null 返回的是 Object。

为什么typeof null 是 Object?
因为在JavaScript中,不同的对象都是使⽤⼆进制存储的,如果⼆进制前三位都是0的话,系统会判断为是Object类型,⽽null的⼆进制全是0,⾃然也就判断为Object
扩展:
000 对象 - object
1 整型 - int
010 双精度类型 - double
100字符串 - strig
110布尔类型 - boolean
1000 Symbol类型
1001 bigint类型

2.instanceof 运算符⽤于判断对象的具体类型,⽐如判断⼀个变量是否是数组类型,⽤typeof是不行的,因为typeof返回的是
object,⽽instanceof可以,因为instanceof可以精准判断对象的具体类型

    //⼿写实现
function myInstance(L, R) { //L代表instanceof左边,R代表右边var RP = R.prototypevar LP = L.__proto__while (true) {if (LP == null) {return false}if (LP == RP) {return true}LP = LP.__proto__}
}
console.log(myInstance({}, Object));

3.constructor 属性
与 instanceof 相似,但是对于 instanceof 只能再检测引⽤类型, ⽽ constructor 还可以检测基本类型,因为
constructor是原型对象的属性指向构造函数。

  • null 和 undefined是⽆效的对象,因此是不会有 constructor 存在的,所以⽆法根据 constructor 来判
    断。
  • JS对象的 constructor 是不稳定的,这个主要体现在⾃定义对象上,当开发者重写prototype 后,原有
    的 constructor 会丢失,constructor 会默认为Object
  • 类继承的也会出错,因为 Object 被覆盖了,检测结果就不对了

4.对象原型链判断:Object.prototype.toString.call(这个是判断类型最准的⽅法)
toString 是Object 原型对象上的⼀个⽅法,该⽅法默认返回其调⽤者的具体类型,更严格的讲,是 toString运⾏时this指向的对象类型, 返回的类型格式为[object,xxx],xxx是具体的数据类型 ,其中包括:String,Number,Boolean,undefined,null,Function,Date,Array,RegExp,Error,HTMLDocument… 基本上所有对象的类型都可以通过这个⽅法获取到。

2.undefined 和 undeclared 的区别

Undeclared(未声明) : 当尝试访问尚未使⽤ var、let 或 const 声明的变量时会发⽣这种情况。
Undefined(未定义) : 它发⽣在使⽤ var、let 或 const 声明变量但未赋值时。
在 JavaScript 中,两者很容易被混为⼀谈typeof 对 undefined 和 undeclared 的 都返回 “undefined”。

3.数组

  • 数组的创建方式:
    var arr = new Array(1, 2);var arr = [1, 2];
  • 数组的常用方法:
Array.from() // 浅拷⻉
从类数组对象或者可迭代对象中创建⼀个新的数组实例。 Array.from还可以接受第⼆个参数,作⽤类似于数组的
map⽅法,⽤来对每个元素进⾏处理,将处理后的值放⼊返回的数组。
Array.of() // 创建数组
根据⼀组参数来创建新的数组实例,⽀持任意的参数数量和类型,没有参数时返回 [],当参数只有⼀个的时候,实
际上是指定数组的⻓度。
Array.prototype.concat() // 连接数组
将传⼊的数组或非数组值与原数组合并,返回⼀个新数组,不影响原数组。
copyWithin(target,start,end)
将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。
target(必需):从该位置开始替换数据。如果为负值,表示倒数。
start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
end(可选):到该位置前停⽌读取数据,默认等于数组⻓度。如果为负值,表示从末尾开始计算。
find() 
⽤于找出第⼀个符合条件的数组成员
参数是⼀个回调函数,接受三个参数依次为当前的值、当前的位置和原数组
findIndex()
findIndex返回第⼀个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1
find和findIndex这两个⽅法都可以接受第⼆个参数,⽤来绑定回调函数的this对象
fill()
还可以接受第⼆个和第三个参数,⽤于指定填充的起始位置和结束位置.
注意,如果填充的类型为对象,则是浅拷⻉.
push() pop() shift() unshift() 
splice(index,howmay,item1,.....,itemX)
index : 必需。添加/删除项⽬位置,使⽤负数可从数组结尾处规定位置。
howmany :必需。要删除项⽬数量。如果设置为 0,则不会删除项⽬。
item1, ..., itemX: 可选。向数组添加新项⽬。
concat()
concat⽅法⽤于连接两个或多个数组。该⽅法将返回⼀个新数组,不影响原数组。
slice()
创建⼀个包含原有数组中⼀个或多个元素的新数组
reduce()
reduce() ⽅法不会改变原始数组。
filter()
将所有元素进⾏判断,将满⾜条件的元素作为⼀个新的数组返回
some()
将所有元素进⾏判断返回⼀个布尔值,如果存在元素都满⾜判断条件,则返回 true,若所有元素都不满⾜判断条
件,则返回 falseevery()
将所有元素进⾏判断返回⼀个布尔值,如果所有元素都满⾜判断条件,则返回 true,否则为 falsejoin()
将数组中的所有元素转换⼀个字符串。
flat()
将数组展平,返回⼀个新数组,原数组不改变。
flatMap()
将数组中的每个元素都执行⼀个提供的函数,该函数返回⼀个新数组。
indexof()
返回数组中第一个符合条件的元素的索引,如果不存在,则返回-1includes()
返回一个布尔值,表示数组中是否包含给定的元素。
forEach()
遍历数组,将数组中的每个元素执行⼀个提供的函数。
map()
将数组中的每个元素都执行⼀个提供的函数,返回由每次函数调⽤结果组成的新数组。
reverse()
将数组中的元素顺序反转。
sort()
对数组中的元素进⾏排序。
toString()
将数组中的元素转换⼀个字符串。

4.数组去重

1.indexOf,filter

    const arr = [1,2,3,2,3,4]const newArr = arr.filter((item,index) => {if(arr.indexOf(item) === index) {return true } else {return false}})

2.Set

    const set = new Set(arr)const newArr = [...set]

3.Map

    const map = new Map()arr.forEach(item => {if(!map.has(item) {map.set(item,true)})})const newArr = [...map.keys()]

4.forEach,includes

    const arr = [1,2,3,4,3,4,5]const newArr = []arr.forEach(item => {if(!newArr.includes(item)) {newArr.push(item)}})

5.reduce

    const newArr = arr.reduce((pre,i) => {if(pre.indexOf(i) === - 1) {pre.push(i)}},[])

6.暴力算法

    const arr = [1,3,2,3,2,3,2,3,]const newArr = []for(let i = 0 ; i < arr.length;i++) {for(let j = 0;j < i;j++) {if(arr[i] !== arr[j]) {newArr.push(arr[i])} else {break}}}

5.数组拍平

1.flat
flat()⽅法⽤于将数组展平,返回⼀个新数组,原数组不改变。需要传入一个参数,这个参数表示要展平的层数

    const arr = [1,2,[3,4,[5,6]]]const newArr = arr.flat(Infinity)

2.toString + replace + split

    const arr = [1,2,[3,4,[5,6]]]const newArr = arr.toString().replace(/(\[|\])/g,'').split(',')

3.toString + replace + JSON.parse

    const arr = [1,2,[3,4,[5,6]]]const newArr = JSON.parse('[' + arr.toString().replace(/(\[|\])/g,'') + ']')

4.递归

    const arr = [1,2,[3,4,[5,6]]]const newArr = []const fn = (arr) => {for(let i = 0;i < arr.length;i++) {if(Array.isArray(arr[i])) {fn(arr[i])} else {newArr.push(arr[i])}}}fn(arr)

5.扩张运算符

    const arr = [1,2,[3,4,[5,6]]]const newArr = [].concat(...arr)

6.ES6新增的数组方法

1.find // 找到符合条件的第一个元素
2.findIndex // 找到符合条件的第一个元素索引
3.includes // 判断数组中是否包含某个元素
4.flat // 数组拍平
5.flatMap // 数组拍平,并且可以指定回调函数
6.Array.at(index) // 返回指定索引的元素
7.Array.from(arrayLike) // 将伪数组或可遍历对象转换为真数组
8.Array.of(element0, element1, …) // 创建一个新的数组实例,并填充元素
9.Array.copyWithin(target, start = 0, end = this.length) // 从数组中拷贝元素到当前数组
10.Array.fill(value, start = 0, end = this.length) // 用指定的值填充数组
11.Array.entries() // 返回一个包含数组中每个索引的键值对的遍历器对象
12.Array.keys() // 返回一个包含数组中每个索引的键的遍历器对象
13.Array.values() // 返回一个包含数组中每个索引的值的遍历器对象
14.Array.sort(compareFunction) // 对数组中的元素进行排序

7.arguments

1.arguments是⼀个类数组对象,它包含函数调⽤时传⼊的参数。
这个对象存在于使用function声明的函数作用域中,并且只存在于函数内部。
这是一个类数组对象,可以进行遍历啊,也可以使使用下标获取元素含有callee,length属性
2.转为数组

    const arr = Array.from(arguments)const arr = [...arguments]
    Array.prototype.slice.call(argument) // Array.prototype.slice这个方法可以在传入一个类数组对象,该函数会调用类属组上的length属性进行遍历截取,因此在后两个参数中不传值则会将整个类数组都复制一遍,生成一个数组返回

3.扩展运算符

    const arr = [...arguments]const arr = [...arguments.callee]   

8.对象

1.遍历对象
可以使用hasOwnProperty 函数来判断对象一个属性是不是存在与对象那个之中
对象也可以使用[]语法访问某一个属性

    for(let key in obj) {} // 使用for...in 运算可以遍历对象的可枚举属性,包括对象继承的属性Object.keys(obj) // 这个方法可以返回对象中的所有可枚举(不包括继承属性)属性组成的一个数组Object.getOwnPropertyNames(obj) // 这个方法可以返回对象中所有的属性,包括不可枚举的属性Object.getOwnPropertySymbols(obj) // 这个方法可以返回对象中所有的Symbol属性组成的数组Reflect.ownKeys(obj) // 这个方法可以返回对象中所有的属性,包括不可枚举的属性和Symbol属性Object.entries(obj) // 这个方法可以返回对象中所有可枚举的属性组成的数组Object.values(obj) // 这个方法可以返回对象中所有可枚举的属性值组成的数组Object.fromEntries(obj) // 这个方法可以将一个键值对组成的数组转换为对象

9.for…in 和 for…of

1.for…in // 遍历对象的可枚举属性,包括对象继承的属性(专门为遍历对象而构建)

2.for…of // 遍历数组,字符串,Map,Set,arguments等可迭代对象

10.原型与原型链

1.原型
每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。当这个函数作为构造函数创建实例时,该实例的内部[[Prototype]]指针被赋值为构造函数的prototype属性。这样构造函数的原型对象就和实例产生联系,实力就可以调用构造函数原型对象上的属性与方法。例如Array数组实例的绝大多数api都是来自Array.prototype原型对象。prototype有⼀个默认的constructor属性,⽤于记录实例由哪个构造函数创建.constructor,每⼀个原型都有⼀个constructor属性指向关联的构造函数.
2.原型链
每个实例对象都有一个内部属性[[Prototype]],指向构造函数的原型对象。这个原型对象也有一个自己的原型对象[[Prototype]],层层向上直到Object.特殊的 Function 对象,Function 的 proto 指向的是⾃身的 prototype。
⼀切对象都是继承⾃Object对象,Object 对象直接继承根源对象null。
⼀切的函数对象(包括 Object 对象),都是继承⾃ Function 对象。
Object 对象直接继承⾃ Function 对象。
Function对象的proto会指向⾃⼰的原型对象,最终还是继承⾃Object对象。

43.javaScript中的继承方式

1.原型链继承
由于原型链的存在,可以手动修改一个对象的原型,达到继承的目的。这样一来这个对象的原型对象上的属性与方法可以被该对象使用,近似的实现了两个对象之间的继承关系

    // 父对象构造函数function Person(name) {}Person.prototype.name = 'zhangsan'Person.prototype.say = function() {}// 子对象构造函数function Student(name) {}Student.prototype = new Person()const student = new Student()student.name // zhangsan 实现两个对象之间的继承关系
优点:
  1. 原型链继承是JavaScript中实现继承的主要方式,也是最常用的继承方式。
  2. 原型链继承可以共享父对象的原型属性和方法,避免了重复创建对象。
  3. 原型链继承可以实现多继承,即一个子对象可以同时继承多个父对象。
缺点:
  1. 原型链继承的缺点是子对象共享父对象的原型属性和方法,如果父对象的原型属性是一个引用类型,那么子对象修改这个属性,会影响到其他子对象。
  2. 原型链继承的缺点是子对象无法向父对象传递参数,因为子对象的原型是父对象的一个实例,父对象的构造函数在创建子对象的原型时,子对象无法向父对象的构造函数传递参数。
  3. 原型链继承的缺点是子对象无法继承父对象的构造函数,因为子对象的原型是父对象的一个实例。

2.借用构造函数继承
通过利用javascript中的this关键字,在构造函数中调用父构造函数,并且指定父构造函数this指向为当前作用域this,即可以将父构造函数中添加属性与方法的操作在子构造函数中执行一遍,从而间接实现了继承。

    // 父构造函数function Parent (name) {this.name = namethis.say = function () {}}// 子构造函数function Child (name) {Parent.call(this, name)}const child = new Child("zhangsan")child.name // zhangsan 
优点:
  1. 借用构造函数继承可以向子对象传递参数,解决了原型链继承的缺点。
  2. 借用构造函数继承可以实现多继承,即一个子对象可以同时继承多个父对象。
缺点:
  1. ⽅法都在构造函数中 定义,每次创建实例都会创建⼀遍⽅法

3.组合继承
组合继承是JavaScript中实现继承的主要方式,也是最常用的继承方式。
组合继承通过原型链继承父对象的属性和方法,通过借用构造函数继承父对象的方法。

    // 父构造函数function Parent (name) {this.name = namethis.say = function () {}}// 子构造函数function Child (name) {Parent.call(this, name)}Child.prototype = new Parent()const child = new Child("zhangsan")child.name // zhangsan 
优点:
  1. 组合继承可以共享父对象的原型属性和方法,避免了重复创建对象。
  2. 组合继承可以实现多继承,即一个子对象可以同时继承多个父对象。
  3. 组合继承可以向子对象传递参数,解决了原型链继承的缺点。
缺点:
  1. 组合继承的缺点是子对象的原型是父对象的一个实例,父对象的构造函数在创建子对象的原型时,子对象无法继承父对象的构造函数。

4.Class继承
ES6中新增的Class语法糖,通过extends关键字实现继承。

    class Parent {constructor(name) {this.name = name}say() {}}class Child extends Parent {constructor(name) {super(name)}}const child = new Child("zhangsan")child.name // zhangsan 
优点:
  1. Class继承可以共享父对象的原型属性和方法,避免了重复创建对象。
  2. Class继承可以实现多继承,即一个子对象可以同时继承多个父对象。
  3. Class继承可以向子对象传递参数,解决了原型链继承的缺点。
缺点:
  1. Class继承的缺点是子对象的原型是父对象的一个实例,父对象的构造函数在创建子对象的原型时,子对象无法继承父对象的构造函数。

44.new操作符创建一个对象的过程

1.创建一个空对象
new操作符使用会创建一个空对象,并且将这个空对象的原型指向构造函数的prototype属性。
2.修改this指向
3.调用构造函数
4.返回对象

手写一个new操作符

    function newOperator(func,...args) {// 1.创建新对象const obj = {}// 2.将新对象的原型指向构造函数的prototype属性obj.__proto__ = func.prototype// 3.修改this指向并调用构造函数const res = func.apply(obj,args)// 4.返回新对象return typeof res === 'object' ? res : obj}

45.instanceof 操作符

原理: instanceof操作符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。原理是判断构造函数的prototype属性是否出现在对象的原型链上
手写一个instanceof操作符

    function instanceOf(left,right) {// 循环判断构造函数是否出现在对象的原型链上while(left !== null) {if(left.__proto__ === right.prototype) {return true}left = left.__proto__}return false}

相关文章:

前端基础面试题·第三篇——JavaScript(其一)

1.JavaScript数据类型与运算符 数据类型 原始数据类型&#xff1a; 1.Number 2.String 3.Boolean 4.undefined 5.null 6.Symbol 7.bigint 复杂数据类型&#xff1a; 1.Function 2.非函数&#xff1a; Array: 数组 Object: 对象 Date: 日期 RegExp: 正则 Map: 映射 Set: 集合 …...

【机器学习】生成对抗网络(Generative Adversarial Networks, GANs)详解

1.引言 生成对抗网络(Generative Adversarial Networks, GANs)是近年来人工智能领域最具创新性和颠覆性的模型之一。自2014年由Ian Goodfellow及其团队提出以来,GAN的出现彻底改变了生成模型的研究范式。传统的生成模型,如变分自编码器(VAE)、隐马尔可夫模型(HMM)等,…...

QT作业1

1> 手写unique_ptr指针指针 代码&#xff1a; #include <iostream>using namespace std;// 自定义的unique_ptr类模板 template <typename T> class unique_ptr { public:// 构造函数&#xff0c;接收一个指针explicit unique_ptr(T* ptr nullptr) noexcept …...

Mybatis-设计模式总结

1、Builder模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。”&#xff0c;它属于创建类模式&#xff0c;一般来说&#xff0c;如果一个对象的构建比较复杂&#xff0c;超出了构造函数所能包含的范围&#x…...

【笔记】Java | 三目运算符和Math函数的比较

实际效果 比较两数并赋值&#xff0c;如下两种方法的耗时不会有差异。 result Math.min(result, subLen);result result < subLen ? result : subLen; 源码解析 因为源码Math.min的源码本质就算三目运算符的比较&#xff0c;所以执行结果是一样的。 三目运算符简介 概…...

信创实践(2):利用Leapp工具迁移CentOS至AnolisOS,实现系统升级与自主可控

1. 引言 为了满足用户在CentOS退出后对操作系统使用的诉求&#xff0c;OpenAnolis龙蜥社区正式发布了Anolis OS。越来越多的CentOS客户期望能够迁移到Anolis OS上来。操作系统迁移是一个复杂工程&#xff0c;手工迁移技术要求高&#xff0c;操作复杂度强&#xff0c;需要耗费大…...

数据库死锁查询SQL

Oracle 从Oracle数据库的动态性能视图&#xff08;Dynamic Performance Views&#xff09;中检索当前被锁定的数据库对象的相关信息&#xff0c;以及持有这些锁的会话&#xff08;session&#xff09;的详细信息。具体来说&#xff0c;它连接了v$ session和v$locked_object两个…...

vLLM (4) - LLMEngine上篇

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 文章目录 系列文章目录前言一、类图二、LLM三、LLMEngine四、GPUExectuor五、Worker六、ModelRunner七、Cache…...

Java重修笔记 第五十天 HashSet 和 TreeSet 的去重机制比较

HashSet 和 TreeSet 的去重机制比较 1. HashSet 的去重机制&#xff1a;HashCode() equals() 。通过运算得到 key &#xff0c;也就是该对象的哈希值&#xff0c;再通过哈希值得到该对象在 table 表上的索引位置&#xff0c;若该位置上没有链表数据就直接存放&#xff0c;若…...

提前购|基于SSM+vue的创新型产品提前购平台(源码+数据库+文档)

创新型产品提前购平台 基于SSMvue的创新型产品提前购平台 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 发布企业管理实现 个体管理实现 投资企业管理实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选…...

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​&#xff0c;请问这个序列最长有多少长的前缀&#xff0c;满足元素的和大于或等于 00&#xff1f;如果任何长度大于 00 的前缀之和都为负数&#xff0c;则输出 00 输入格式 第一行&#xff1a;单个整数表示 nn第二行&a…...

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 FeatureExtraction 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算&#xff08;calculateSmoothness()&#xff09;2. 标记遮挡点&#xff08;markOcc…...

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2757 标注数量(xml文件个数)&#xff1a;2757 标注数量(txt文件个数)&#xff1a;2757 标注…...

opencart journal 3 在价格前添加文本prefix

要修改的文件: /catalog/view/theme/journal3/template/product.twig 行274: <div class="product-price">{{ price }}</div>{% else %}<div class="product-price-new">{{ special }}</div><div class="product-pric…...

c++ string类的模拟实现的注意事项

一.构造函数 第一种形式&#xff0c;使用字符指针赋值 为了防止修改&#xff0c;我们传入了常量字符串。但是这里的初始化列表出错了&#xff0c;因为_str是一个变量&#xff0c;将常量给到一个变量涉及到权限的放大&#xff0c;是错误的。那该怎么写呢&#xff1f;对_str的赋…...

Unity3D中控制3D场景中游戏对象显示层级的详解

前言 在Unity3D开发中&#xff0c;控制游戏对象的显示层级&#xff08;也称为渲染顺序或渲染层级&#xff09;是一个常见的需求&#xff0c;特别是在处理复杂的3D场景时&#xff0c;如角色、道具、UI元素等的可见性和渲染顺序的管理变得尤为重要。Unity通过几种不同的机制来实…...

代码执行漏洞-Log4j2漏洞 vulhub CVE-2021-44228

步骤一:执行以下命令启动靶场环境并在浏览器访问!!! 查看端口 浏览器访问 可以发现 /solr/admin/cores?action 这⾥有个参数可以传&#xff0c;可以按照上⾯的原理 先构造⼀个请求传过去存在JNDI注⼊那么ldap服务端会执⾏我们传上去的payload JDNI项⽬地址 https://github.com…...

uniapp / uniapp x UI 组件库推荐大全

在 uniapp 开发中&#xff0c;我们大多数都会使用到第三方UI 组件库&#xff0c;提起 uniapp 的UI组件库&#xff0c;我们最常使用的应该就是uview了吧&#xff0c;但是随着日益增长的需求&#xff0c;uview 在某些情况下已经不在满足于我们的一些开发需求&#xff0c;尽管它目…...

花8000元去培训机构学习网络安全值得吗,学成后就业前景如何?

我就是从培训机构学的网络安全&#xff0c;线下五六个月&#xff0c;当时学费不到一万&#xff0c;目前已成功入行。所以&#xff0c;只要你下决心要入这一行&#xff0c;过程中能好好学&#xff0c;那这8000就花得值~ 因为只要学得好&#xff0c;工作两个多月就能赚回学费&am…...

PhpStorm 下调试功能配置

调试是开发过程中的关键环节&#xff0c;能够极大地减少应用程序中的错误并提高代码质量。PhpStorm 作为一款功能强大的 IDE&#xff0c;提供了丰富的调试功能&#xff0c;结合 Xdebug&#xff0c;可以让开发者更轻松地进行 PHP 应用程序的调试。本指南将详细介绍如何在 PhpSto…...

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)

1、MVC MVC&#xff08;Model-View-Controller&#xff09; 是一种常用的架构模式&#xff0c;用于分离应用程序的逻辑、数据和展示。它通过三个核心组件&#xff08;模型、视图和控制器&#xff09;将应用程序的业务逻辑与用户界面隔离&#xff0c;促进代码的可维护性、可扩展…...

【H2O2|全栈】关于HTML(4)HTML基础(三)

HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类&#xff08;三&#xff09; 本文中的标签在什么位置中使用&#xff1f; 列表 ​编辑​编辑 有序列表 无序列表 自定义列表 表格 拓展案例 预告和回顾 后话 前言 本系列博客将分享HTML相关知识点…...

关于找不到插件 ‘org.springframework.boot:spring-boot-maven-plugin:‘的解决方案

找到项目结构后&#xff0c;点击库&#xff0c;全选所有后点击应用即可...

深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

文章目录 文章导图RabbitMQ架构及相关概念四大核心概念名词解读 七大工作模式及四大交换机类型0、前置了解-默认交换机DirectExchange1、简单模式(Simple Queue)-默认DirectExchange2、 工作队列模式(Work Queues)-默认DirectExchange3、发布/订阅模式(Publish/Subscribe)-Fano…...

将目标检测模型导出到C++|RT-DETR、YOLO-NAS、YOLOv10、YOLOv9、YOLOv8

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 最近&#xff0c;出现了更新的YOLO模型&#xff0c;还有RT-DETR模型&#xff0c;这是一个声称能击败YOLO模型的变换器模型&#xff0c;我想将这些模型导出并进行比较&#xff0c;并将它们添加到我的库中。在这篇文章中&a…...

【Windows】解决新版 Edge 浏览器开机自启问题(简单有效)

文章目录 1.前言2.查找资料3.查找方法4.解决办法1.点击浏览器的三个...&#xff0c;然后点击设置2.选择【开始、主页和新建标签页】选项卡&#xff0c;然后关闭【Windows设备启动时】 结语 参考文章&#xff1a; 解决新版 Edge 浏览器开机自启问题&#xff08;简单有效&#xf…...

如何给3D人物换衣服CC4

1.导入人物 2.设置人物Apose 3.导入衣服 create -> accessory 选择fbx文件 设置衣服的大小和位置。 4.绑定衣服 设置衣服的权重 添加动作就可以看效果了。...

如何对列表、字符串进行分组

如何对列表、字符串进行分组 1、效果 2、代码 使用python自带库collections中的Counter函数即可实现 代码如下: # -*- coding: utf-8 -*-""" @contact: @file: test.py @time: 2024/9/8 11:18 @author: LDC """ from collections import Co…...

【GEE代码实例教程详解:NDVI时间序列趋势分析】

GEE&#xff08;Google Earth Engine&#xff09;是一个强大的云计算平台&#xff0c;用于处理和分析大规模地球科学数据集。以下是一个关于如何使用GEE进行NDVI&#xff08;归一化植被指数&#xff09;时间序列趋势分析的详细教程。 一、引言 NDVI时间序列趋势分析是一种统计…...

51单片机-DS1302(RTC实时时钟芯片)

数据手册在主页资源免费贡献 开发板芯片数据手册 https://www.alipan.com/s/nnkdHhMGjrz 提取码: 95ik 点击链接保存&#xff0c;...