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

深入理解 JavaScript 对象与属性控制

ECMA-262将对象定义为一组属性的无序集合,严格来说,这意味着对象就是一组没有特定顺序的值,对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值. 可以把js的对象想象成一张散列表,其中的内容就是一组名/值对,值可以是数据或者函数  

1. 理解对象

创建自定义对象的通常方式是创建Objcet的一个新实例,然后再给它添加属性和方法,如下例所示: 

let person=new Object(); 
person.name='Nicholas'; 
person.age=29; 
person.sayName=function(){console.log(this.name)
}

这个例子创建了一个名为person的对象,而且有2个属性(name,age和job)和一个方法(sayName( )),sayName()方法会显示this.name的值,这个属性会解析为person.name 早期,js开发者频繁使用这种方式, 

现在流行的方式为使用对象字面量 

let person={name:"Nicholas",age:29,sayName(){console.log(this.name)}
}

1.1属性的类型

ECMA-262使用一些内部特性来描述属性的特征,这些特性是由js实现引擎的规范定义的,因此,开发者不能在js中直接访问这些特性,为了将某个特性表示为内部特性,规范会用两个中括号把特性的名称括起来,比如[[Enumerable]]  属性分两种: 数据属性和访问器属性

1.数据属性 

数据属性包含一个保存数据值的位置,值会从这个位置读取,也会写入到这个位置,数据属性有4个特性描述它们的行为

  • [[Configurable]]: 表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性,默认情况下,所有直接定义在对象的属性的这个特性都是true,如前面的例子所示
  • [[Enumerable]]: 表示属性是否可以通过for-in循环返回,默认情况下,所有直接定义在对象上的属性的这个特性都是true,如前面的例子所示 
  • [[Writable]]:表示属性的值是否可以被修改,默认情况下,所有直接定义在对象上的属性的这个特性都是true,如前面的例子所示 
  • [[Value]]: 包含属性实际的值,这就是前面提到的那个读取和写入属性值的位置这个特性的默认值为undefined 

在像前面例子中那样将属性显示添加到对象之后,上面的属性都会被设置为true,而[[value]]也会被设置为指定的值 

例如

let person={

  name:'Nicholas'

}

这里,我们创建了一个名为name的属性,并给它赋予了一个值"nicholas",这意味着[[Value]]特性会被设置为"Nicholas",之后对这个值的任何修改都会保存这个位置  

要修改属性的默认特性,就必须使用Object.defineProperty(obj,prop,descriptor)方法,这个方法接收三个参数,要给其添加属性的对象,属性的名称和一个描述符对象,最后一个参数,即描述符对象上的属性可以包含: configurable,enumerable,writable和value,跟相关特性的名称一 一对应,根据要修改的特性,可以设置其中一个或多个值 ,比如: 

let person={ };

Object.defineProperty(person.name,{

         writable: false,  //属性不可被修改 

        value:"Nicholas"

});

console.log(person.name); //'Nicholas'

person.name='Greg'; 

console.log(person.name), //"nicholas"

在非严格模式下尝试给这个属性重新赋值会被忽略,在严格模式下,尝试修改只读属性的值会抛出错误,类似的规则也适用于创建不可配置的属性,比如configurable,此外,一个属性被定义为不可配置之后,就不能再变回可配置的了,再次调用Object.defineProperty()并修改任何非writable属性会导致错误: 

let person={ };

Object.defineProperty(person.name,{

         writable: false,  //属性不可被修改 

        value:"Nicholas"

});



//抛出错误 

object.defineProperty(person,'name',{

   configurable: true, 

   value:'Nichoselas'

}); 


因此,虽然可以对同一个属性多次调用Object.defineProperty(),但在把configurable设置为false之后就会受限制了 

可以理解为: configurable是总开关,关了之后一切锁死,

                    writable 是局部锁,关了就变只读 

                    在configurable: false的前提下,只能单向关闭writable,不能重新打开 

在调用Object.defineProperty()时,configurable,enumerable和ritable的值如果不指定则都默认为false,多数情况下,可能都不需要Object.defineProperty()提供的这些强大的设置,但要理解js对象,就要理解这些概念

2.访问器属性

访问器属性不包含数据值,相反,它们包含一个获取(getter)函数和一个设置(setter)函数,不过这两个函数不是必需的,在读取访问器属性时,会调用获取函数,这个函数的责任就是返回一个有效的值,在写入访问器属性时,会调用设置函数并传入新值,这个函数必须对数据做出什么修改,访问器有4个特性描述它们的行为 

  • [[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性,默认情况下,所有直接定义在对象上的属性的这个特性都是true 
  • [[Enumerable]]: 表示属性是否可以通过for-in 循环返回,默认情况下,所有直接定义在对象上的属性的这个特性都是true 
  • [[Get]]: 获取函数,在读取属性时调用,默认值为undefined 
  • [[Set]]: 设置函数,在写入属性时调用,默认值为undefined 

访问器属性是不能直接定义的,必须使用Object.defineProperty(obj,prop,descriptor);

  • obj: 目标对象
  • prop: 要定义或修改的属性名
  • descriptor: 属性描述符对象

//定义一个对象,包含伪私有成员year_和公共成员edition 

let book={

     year_ : 2017, 

    edition: 1

}

Object.defineProperty(book,"year",{

    //访问器属性,返回year_的值

   get(){

      return this.year_; //2017

    },

   set(newValue){

     if(newValue>2017){

         this.year_=newValue; 
         this.edition+=newValue-2017;

         //1+2018-2017=2

       }

   }

}); 

book.year=2018;

console.log(book.edition); // 2

在这个例子中,对象book有两个默认属性: year_和edition,year_中的下划线常用来标识该属性并不希望在对象方法的外部被访问,另外一个属性year被定义为一个访问器属性,其中获取函数简单地返回year_的值,而设置函数会做一些计算,因此,把year属性修改为2018会导致year_变成2018,edition变成2,这就是访问器属性的典型场景,及设置一个属性值会导致一些其他变化的发生

获取函数和设置函数不一定都要定义,只定义获取函数意味着属性是只读的,尝试修改属性会被忽略,在严格模式下,尝试写入只定义了获取函数的属性会抛出错误,类似地,只有一个设置函数的属性是不能读取的,在非严格模式下去读会返回undefined,严格模式下会抛出错误                                           

1.2. 定义多个属性 Object.defineProperties()

Object.defineProperties() 通过多个描述符一次性定义多个属性, 接受两个参数: 要为之添加或修改属性的对象和另一个描述符对象,其属性要与添加或修改的属性意义对应,比如: 

let book={ }; 

Object.defineProperties(book,{

   year_:{

      value: 2017

   },

   editon:{

      value:1

   }, 

   year:{

       get: function(){

         return this.year_; 

       }

    },

    set: function(newValue){

       if(newValue>2017){

           this.year_=newValue 

           this.edition+=newValue-2017;

       }

   }

})



let descriptor=Object.getOwnPropertyDescriptor(book,"year_"); 

console.log(descriptor.value); //2017

console.log(descriptor.configurable); //false

console.log(typeof descriptor.get); //undefined  数据属性没有get.get 

let descriptor=Object.getOwnPropertyDescriptor(book,"year"); 

console.log(descriptor.value); //false 

console.log(descriptor.enumerable); //false 

console.log(typeof descriptor.get); // "function"

对于数据属性year_,value 等于原来的值,configurable是false,get是undefined.

对于访问器属性year,value是undefined,enumerable是false,get是一个指向获取函数的指针 

1.3. 合并对象 

1.Object.assign()方法

这个方法接收一个目标对象和一个或多个源对象作为参数,然后将每个源对象中可枚举(Object.propertyIsEnumerable()返回true)和自有(Object.hasOwnProperty()返回true)属性复制到目标对象,以字符串和符号为键的属性会被复制,对每个符合条件的属性,这个方法会使用源对象上的[[Get]]取得属性的值,然后使用目标对象上的[[Set]]设置属性的值

//简单复制 

let dest,src,result; 

dest={ };

src={id:'src'}; 

result=Object.assign(dest,src); 

//Object.assign修改目标对象

//也会返回修改后的目标对象

console.log(dest===result) //true 

console.log(dest !== src) //true 

console.log(result) //{id: src}

console.log(dest) //{id:src}

//多个源对象 

dest={ }; 

result=Object.assign(dest,{a:'foo'},{b:'bar'}); 

console.log(result); // {a:foo,b:bar}

Object.assign( )实际上对每个源对象执行的是浅复制,如果多个源对象都有相同的属性,则使用最后一个复制的值,此外,从源对象访问器属性取得的值,比如获取函数,会作为一个静态值赋给目标对象,换句话说,不能在两个对象间转移获取函数和设置函数  

  • 会覆盖重复的属性
  • 浅复制意味着只会赋值对象的引用 

如果赋值期间出错,则操作会中止并退出,同时抛出错误,Object.assign( )没有"回滚"之前赋值的概念,因此它是一个尽力而为,可能只会完成部分赋值的方法 

1.4. 对象表示及相等判定

在es6之前,有些特殊情况即使是===操作符也无能为力

这些是===符合预期的情况

console.log(true===1); //false 

console.log({}==={}); //false 

console.log('2'===2); false 

这些情况在不同js引擎中表现不同,但仍被认为相等

console.log(+0 === -0); //true 

console.log(+0=== 0); //true 

console.log(-0 === 0); //true 

要确定NaN的相等性,必须使用及其讨厌的isNaN()

console.log(NaN===NaN); //false 

console.log(isNaN(NaN)); //true 

为改善这类情况,es6规范新增了Object,is(), 这个方法与===很像, 但同时也考虑了上述边界情形,这个方法必须接收两个参数: 

console.log(Object.is(true,1)); //false  

//正确的0,-0,+0 相等/不等判定 

console.log(Object.is(+0,-0)); //false 
//正确的NaN相等判定

console.log(Object.is(NaN,NaN)); //true 

1.5 增强的对象语法 

es6为定义和操作对象新增了很多及其有用的语法糖特性,这些特性都没有改变现有引擎的行为,但极大地提升了处理对象的方便程度 

1. 属性值简写 

let name='Matt'; 

let person={

  //之前写法 

  name:name 

  //现在写法

  name 

}

2.可计算属性

在引入可计算属性之前,如果想使用变量的值作为属性,那么必须先声明对象,然后使用中括号语法来添加属性,换句话说,不能在对象字面量中直接动态命名属性,比如: 

const nameKey='name'; 

const ageKey='age'; 

const jobKey='job'; 

let person={

   [nameKey]: 'Matt', 

   [ageKey]: 27,

   [jobKey]: 'Software engineer'

 }; 

console.log(person); //{name:'Matt',age:27,job:'Software engineer'}

因为被当做js表达式求值,所以可计算属性可以是复杂比的表达式,在实例化时再求值: 


function getUniqueKey(key){

  return `${key}_${uniqueToken++}`; 

}

let  person={

     [getUniqueKey(nameKey)] : 'Matt', 

     [getUniqueKey(ageKey)]: 27, 

     [getUniqueKey(jobKey)]:'Software engineer'

}; 

console.log(person); //{name_0:'Matt',age_1:27,job_2:'Software engineer'}
 

注意 可计算属性表达式中抛出任何错误都会中断对象创建,如果计算属性的表达式有副作用,那就要小心了,因为如果表达式抛出错误,那么之前完成的计算是不能回滚的 

3.简写方法名

let person={

  //一般写法 

   sayName: function(name){

     console.log(`My name is ${name}`); 

   }

   //简写

   sayName(name){

        console.log(`My name is ${name}`); 

    }

}; 

1.6. 对象解构 

可以在一条一句中使用嵌套数据实现一个或多个赋值操作,简单地说,对象结构就是使用与对象匹配的结构来实现对象属性赋值 

//不使用对象结构let person={name:'Matt', age: 27 }let personName=person.name, personAge=person.age; cosnole.log(personName); //Matt console.log(personAge); //27//1. 使用对象解构 let {name: personName,age: personAge}=person 
console.log(personName); //Matt console.log(personAge); //27 //2. 简写语法,变量直接使用属性的名称, 
let {name,age}=person; console.log(name); //Matt console.log(job); //undefined//3. 默认值 let {name,job='Software engineer'}=person; console.log(name); //Matt console.log(job); //Software engineer  //4.解构并不要求必须在结构表达式中声明,不过,如果是事先声明的变量赋值,则赋值表达式,必须包含在一对括号中:  let personName,personAge; //先声明 
({name:personName,personAge}=person)
1.6.1嵌套解构 

解构对于引用嵌套的属性或赋值目标没有限制,为此,可以通过结构来复制对象属性: 

let  person={

   name:'Matt',

   age: 27,

   job: {

      title: 'Software engineer'

   }

}; 

let personCopy={ }; 

({

  name: personCopy.name, 

   age :  personCopy.age, 

    job: personCopy.job  

}=person); 
 

//因为一个对象的引用被赋值给personCopy,所以修改person.job的对象属性也会影响personCopy 

person.job.title='Hacker'

console.log(personCopy); //{name:'Matt',age:27,job:{title:'Hacker'}}

解构赋值可以使用嵌套结构,以匹配嵌套的属性:  


//声明title变量并将person.job.title的值赋值给它 

let {job:{title}}=person; 

console.log(title)   //Software engineer 

注意: 1. 在外层属性没有定义的情况下不能使用嵌套解构,无论源对象还是目标对象都一样

          2. 涉及多个属性的解构赋值是一个输出无关的顺序化操作,如果一个结构表达式涉及多个赋                  值,开始的赋值成功而后面的赋值出错,则整个解构赋值只会完成一部分

相关文章:

深入理解 JavaScript 对象与属性控制

ECMA-262将对象定义为一组属性的无序集合,严格来说,这意味着对象就是一组没有特定顺序的值,对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值. 可以把js的对象想象成一张散列表,其中的内容就是一组名/值对,值可以是数据或者函数 1. 理解对象 创建自定义对象的…...

深入理解 Linux 虚拟文件系统(VFS)

在 Linux 操作系统的世界里,虚拟文件系统(Virtual File System,VFS)扮演着极为关键的角色。它就像是一座桥梁,连接着各种不同类型的物理文件系统与操作系统以及应用程序,使得我们在使用 Linux 时能够以统一…...

AI云防护真的可以防攻击?你的服务器用群联AI云防护吗?

1. 传统防御方案的局限性 静态规则缺陷:无法应对新型攻击模式(如HTTP慢速攻击)资源浪费:固定带宽采购导致非攻击期资源闲置 2. AI云防护技术实现 动态流量调度算法: # 智能节点选择伪代码(参考群联防护…...

计算机视觉——MedSAM2医学影像一键实现3D与视频分割的高效解决方案

引言 在乡村医院的傍晚高峰时段,扫描室内传来阵阵低沉的嗡鸣声,仿佛一台老旧冰箱的运转声。一位疲惫的医生正全神贯注地检查着当天的最后一位患者——一位不幸从拖拉机上摔下的农民,此刻正呼吸急促。CT 机器飞速旋转,生成了超过一…...

软件工程之软件项目管理深度解析

前文基础: 1.软件工程学概述:软件工程学概述-CSDN博客 2.软件过程深度解析:软件过程深度解析-CSDN博客 3.软件工程之需求分析涉及的图与工具:软件工程之需求分析涉及的图与工具-CSDN博客 4.软件工程之形式化说明技术深度解…...

40. 组合总和 II

题目 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates [10,1…...

java-多态

一、多态的来历 我们先来了解一个业务场景:请设计一个系统,描述主人喂养宠物的场景,首先在这个场景当中应该有”宠物对象“,“宠物对象”应该有一个吃的行为,另外还需要一个“主人对象”,主人应该有一个喂的…...

重构 cluster-db 选择器,新增限制字段 showDb 不影响原功能前提实现查询功能增量拓展

1.为DbSelect组件新添加showDb字段 :show-db"false"时只显示集群不显示数据库信息 重构 cluster-db 选择器&#xff0c;新增限制字段 showDb 不影响原功能前提实现查询功能增量拓展,。保证组件**高可用性,减少冗余方法的编写,提高整体代码复用性和维护性**。 <!-…...

Modbus RTU 详解 + FreeMODBUS移植(附项目源码)

文章目录 前言一、Modbus RTU1.1 通信方式1.2 模式特点1.3 数据模型1.4 常用功能码说明1.5 异常响应码1.6 通信帧格式1.6.1 示例一&#xff1a;读取保持寄存器&#xff08;功能码 0x03&#xff09;1.6.2 示例二&#xff1a;写单个线圈&#xff08;功能码 0x05&#xff09;1.6.3…...

新闻发稿筛选媒体核心标准:影响力、适配性与合规性

1. 评估媒体影响力 权威性与公信力&#xff1a;优先选择央级媒体&#xff0c;其报道常被其他平台转载&#xff0c;传播链条长&#xff0c;加分权重高。 传播数据&#xff1a;参考定海区融媒体中心的赋分办法&#xff0c;关注媒体的阅读量、视频播放量等指标&#xff0c;如阅读…...

豆包:基于多模态交互的智能心理咨询机器人系统设计与效果评估——情感计算框架下的对话机制创新

豆包:基于多模态交互的智能心理咨询机器人系统设计与效果评估——情感计算框架下的对话机制创新 摘要 随着人工智能在心理健康领域的应用深化,本文提出一种融合情感计算与动态对话管理的智能心理咨询机器人系统架构。通过构建“用户状态-情感响应-策略生成”三层模型,结合…...

坐席业绩可视化分析工具

这个交互式的坐席业绩分析工具具有以下特点&#xff1a; 数据导入功能&#xff1a;支持上传 CSV 文件&#xff0c;自动解析并展示数据多维度分析&#xff1a;可按日 / 周 / 月分析业绩数据&#xff0c;支持切换不同业绩指标&#xff08;接通时长 / 外呼次数 / 接通次数&#x…...

MATLAB制作柱状图与条图:数据可视化的基础利器

一、什么是柱状图与条图&#xff1f; 柱状图和条图都是用来表示分类数据的常见图表形式&#xff0c;它们的核心目的是通过矩形的长度来比较各类别的数值大小。条图其实就是“横着的柱状图”&#xff0c;它们的本质是一样的&#xff1a;用矩形的长度表示数值大小&#xff0c;不同…...

com.fasterxml.jackson.dataformat.xml.XmlMapper把对象转换xml格式,属性放到标签<>里边

之前从没用过xml和对象相互转换&#xff0c;最近项目接了政府相关的。需要用xml格式数据进行相互转换。有些小问题&#xff0c;困扰了我一下下。 1.有些属性需要放到标签里边&#xff0c;有的需要放到标签子集。 2.xml需要加<?xml version"1.0" encoding"…...

在js中大量接口调用并发批量请求处理器

并发批量请求处理器 ✨ 设计目标 该类用于批量异步请求处理&#xff0c;支持&#xff1a; 自定义并发数请求节拍控制&#xff08;延时&#xff09;失败重试机制进度回调通知 &#x1f527; 构造函数参数 new BulkRequestHandler({dataList, // 要处理的数据列表r…...

Azure资源创建与部署指南

本文将指导您如何在Azure平台上创建和配置必要的资源,以部署基于OpenAI的应用程序。 资源组创建 资源组是管理和组织Azure资源的逻辑容器。 在Azure门户顶端的查询框中输入"Resource groups"(英文环境)或"资源组"(中文环境)在搜索结果中点击"资…...

图解gpt之神经概率语言模型与循环神经网络

上节课我们聊了词向量表示&#xff0c;像Word2Vec这样的模型&#xff0c;它确实能捕捉到词语之间的语义关系&#xff0c;但问题在于&#xff0c;它本质上还是在孤立地看待每个词。英文的“Apple”&#xff0c;可以指苹果公司&#xff0c;也可以指水果。这种一词多义的特性&…...

Jenkins linux安装

jenkins启动 service jenkins start 重启 service jenkins restart 停止 service jenkins stop jenkins安装 命令切换到自己的下载目录 直接用命令下载 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.190.3-1.1.noarch.rpm 下载直接安装 rpm -ivh jenkins-2.190.3-…...

android 修改单GPS,单北斗,单伽利略等

从hal层入手&#xff0c;代码如下&#xff1a; 各个类型如下&#xff1a; typedef enum {MTK_CONFIG_GPS_GLONASS 0,MTK_CONFIG_GPS_BEIDOU,MTK_CONFIG_GPS_GLONASS_BEIDOU,MTK_CONFIG_GPS_ONLY,MTK_CONFIG_BEIDOU_ONLY,MTK_CONFIG_GLONASS_ONLY,MTK_CONFIG_GPS_GLONASS_BEIDO…...

CNG汽车加气站操作工岗位职责

CNG&#xff08;压缩天然气&#xff09;汽车加气站操作工是负责天然气加气设备操作、维护及安全管理的重要岗位。以下是该岗位的职责、技能要求、安全注意事项及职业发展方向的详细说明&#xff1a; *主要职责 加气操作 按照规程为车辆加注CNG&#xff0c;检查车辆气瓶合格证…...

纯Java实现反向传播算法:零依赖神经网络实战

在深度学习框架泛滥的今天&#xff0c;理解算法底层实现变得愈发重要。反向传播(Backpropagation)作为神经网络训练的基石算法&#xff0c;其实现往往被各种框架封装。本文将突破常规&#xff0c;仅用Java标准库实现完整BP算法&#xff0c;帮助开发者&#xff1a; 1) 深入理解…...

springboot3 + mybatis-plus3 创建web项目实现表增删改查

Idea创建项目 环境配置说明 在现代化的企业级应用开发中&#xff0c;合适的开发环境配置能够极大提升开发效率和应用性能。本文介绍的环境配置为&#xff1a; 操作系统&#xff1a;Windows 11JDK&#xff1a;JDK 21Maven&#xff1a;Maven 3.9.xIDE&#xff1a;IntelliJ IDEA…...

多模型协同预测在风机故障预测的应用(demo)

数据加载和预处理的真实性&#xff1a; 下面的代码中&#xff0c;DummyDataset 和数据加载部分仍然是高度简化和占位的。为了让这个训练循环真正有效&#xff0c;您必须用您自己的数据加载逻辑替换它。这意味着您需要创建一个 torch.utils.data.Dataset 的子类&#xff0c;它能…...

韩媒聚焦Lazarus攻击手段升级,CertiK联创顾荣辉详解应对之道

近日&#xff0c;韩国知名科技媒体《韩国IT时报》&#xff08;Korea IT Times&#xff09;刊文引述了CertiK联合创始人兼CEO顾荣辉教授的专业见解&#xff0c;聚焦黑客组织Lazarus在Web3.0领域攻击手段的持续升级&#xff0c;分析这一威胁的严峻性&#xff0c;并探讨了提升行业…...

5.9-selcct_poll_epoll 和 reactor 的模拟实现

5.9-select_poll_epoll 本文演示 select 等 io 多路复用函数的应用方法&#xff0c;函数具体介绍可以参考我过去写的博客。 先绑定监听的文件描述符 int sockfd socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serveraddr; memset(&serveraddr, 0, sizeof(struc…...

图上思维:基于知识图的大型语言模型的深层可靠推理

摘要 尽管大型语言模型&#xff08;LLM&#xff09;在各种任务中取得了巨大的成功&#xff0c;但它们经常与幻觉问题作斗争&#xff0c;特别是在需要深入和负责任的推理的场景中。这些问题可以通过在LLM推理中引入外部知识图&#xff08;KG&#xff09;来部分解决。在本文中&am…...

37-智慧医疗服务平台(在线接诊/问诊)

系统功能特点&#xff1a; 技术栈: springBootVueMysql 功能点: 医生端 用户端 管理员端 医生端: 科室信息管理、在线挂号管理、预约体检管理、体检报告管理、药品信息管理、处方信息管理、缴费信息管理、病历信息管理、智能导诊管理、在线接诊患者功能 (和患者1V1沟通) 用户…...

【新品发布】VXI可重构信号处理系统模块系列

VXI可重构信号处理系统模块概述 VXI可重构信号处理系统模块包括了 GPU 模块&#xff0c;CPU 模块&#xff0c;射频模块、IO 模块、DSP模块、高速存储模块、交换模块&#xff0c;采集处理模块、回放处理模块等&#xff0c;全套组件为单体3U VPX架构&#xff0c;可自由组合到多槽…...

React 第三十八节 Router 中useRoutes 的使用详解及注意事项

前言 useRoutes 是 React Router v6 引入的一个钩子函数&#xff0c;允许通过 JavaScript 对象&#xff08;而非传统的 JSX 语法&#xff09;定义路由配置。这种方式更适合复杂路由结构&#xff0c;且代码更简洁易维护。 一、基础使用 1.1、useRoutes路由配置对象 useRoute…...

Redhat 系统详解

Red Hat 系统深度解析&#xff1a;从企业级架构到核心组件 一、Red Hat 概述&#xff1a;企业级 Linux 的标杆 Red Hat 是全球领先的开源解决方案供应商&#xff0c;其核心产品 Red Hat Enterprise Linux&#xff08;RHEL&#xff09; 是企业级 Linux 的黄金标准。RHEL 以 稳…...

docker常用命令总结

常用命令含义docker info查看docker 服务的信息-------------------------镜像篇docker pull XXX从官网上拉取名为XXX的镜像docker login -u name登录自己的dockerhub账号docker push XXX将XXX镜像上传到自己的dockerhub账户中&#xff08;XXX的命名必须是用户名/镜像名&#x…...

【el-admin】el-admin关联数据字典

数据字典使用 一、新增数据字典1、新增【图书状态】和【图书类型】数据字典2、编辑字典值 二、代码生成配置1、表单设置2、关联字典3、验证关联数据字典 三、查询操作1、模糊查询2、按类别查询&#xff08;下拉框&#xff09; 四、数据校验 一、新增数据字典 1、新增【图书状态…...

component :is是什么?

问&#xff1a; component &#xff1a;is是什么&#xff1f; 是组件&#xff1f; 那我们是不是就不需要自己创建组件了&#xff1f;还是什么意思&#xff1f;component &#xff1a;is和什么功能是类似的&#xff0c;同时和类似功能相比对什么时候用component &#xff1a;is…...

适老化洗浴辅具产业:在技术迭代与需求升级中重塑银发经济新生态

随着中国人口老龄化程度的不断加深&#xff0c;老年群体对于适老化产品的需求日益增长。 适老化洗浴辅具作为保障老年人洗浴安全与舒适的关键产品&#xff0c;其发展状况备受关注。 深入剖析中国适老化洗浴辅具的发展现状&#xff0c;并探寻助力产业发展的有效路径&#xff0…...

『Python学习笔记』ubuntu解决matplotlit中文乱码的问题!

ubuntu解决matplotlit中文乱码的问题&#xff01; 文章目录 simhei.ttf字体下载链接&#xff1a;http://xiazaiziti.com/210356.html将字体放到合适的地方 sudo cp SimHei.ttf /usr/share/fonts/(base) zkfzkf:~$ fc-list | grep -i "SimHei" /usr/local/share/font…...

从AI到新能源:猎板PCB的HDI技术如何定义高端制造新标准?

2025年&#xff0c;随着AI服务器、新能源汽车、折叠屏设备等新兴领域的爆发式增长&#xff0c;高密度互连&#xff08;HDI&#xff09;电路板成为电子制造业的“必争之地”。HDI板凭借微孔、细线宽和高层间对位精度&#xff0c;能够实现电子设备的高集成化与微型化&#xff0c;…...

汽车制造行业的数字化转型

嘿&#xff0c;大家好&#xff01;今天来和大家聊聊汽车制造行业的数字化转型&#xff0c;这可是当下非常热门的话题哦&#xff01; 随着科技的飞速发展&#xff0c;传统的汽车制造行业正经历着一场深刻的变革。数字化技术已经不再是“锦上添花”&#xff0c;而是车企能否在未…...

Redis 常见数据类型

Redis 常见数据类型 一、基本全局命令详解与实操 1. KEYS 命令 功能&#xff1a;按模式匹配返回所有符合条件的键&#xff08;生产环境慎用&#xff0c;可能导致阻塞&#xff09;。 语法&#xff1a; KEYS pattern 模式规则&#xff1a; h?llo&#xff1a;匹配 hello, ha…...

【计算机网络-传输层】传输层协议-TCP核心机制与可靠性保障

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;传输层协议-UDP 下篇文章&#xff1a; 网络层 我们的讲解顺序是&…...

对golang中CSP的理解

概念&#xff1a; CSP模型&#xff0c;即通信顺序进程模型&#xff0c;是由英国计算机科学家C.A.R. Hoare于1978年提出的。该模型强调进程之间通过通道&#xff08;channel&#xff09;进行通信&#xff0c;并通过消息传递来协调并发执行的进程。CSP模型的核心思想是“不要通过…...

嵌入式openharmony标准系统中HDF框架底层原理分析

1、案例简介 该程序是基于OpenHarmony标准系统编写的基础外设类:简易HDF驱动。 2、基础知识 2.1、OpenHarmony HDF开发简介 HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。旨在构建统一…...

238.除自身以外数组的乘积

给你一个数组&#xff0c;求出第 i 个元素以外的数组元素的乘积&#xff0c;不能使用除法&#xff0c;且时间复杂度O(n), 对于一个数&#xff0c;如果知道了前缀元素的乘积和后缀元素的乘积&#xff0c;就知道了这个元素以外的数组元素的乘积&#xff0c;所以现在的问题是如何…...

AI文旅|暴雨打造旅游新体验

今年"五一"假期&#xff0c;全国文旅市场迎来爆发式增长&#xff0c;从丈崖瀑布的磅礴水雾到城市商区的璀璨霓虹&#xff0c;从山野民宿的静谧悠然到主题乐园的欢腾喧嚣&#xff0c;处处人潮涌动。在这火热的景象背后&#xff0c;一股“无形之力”正悄然改变旅游体验…...

学习心得《How Global AI Policy and Regulations Will Impact Your Enterprise》Gartner

AI时代来临,然而与之对应的是海量的数据的安全性和合规性如何保障,如何平衡个人与智能体的利益,恰巧,最近Gartner发布了《How Global AI Policy and Regulations Will Impact Your Enterprise》,我们就其中的观点一起进行探讨。 战略规划假设 我们首先关注的是关键的战略…...

JAVA将一个同步方法改为异步执行

目的&#xff1a; 这么做的目的就是为了使一个高频率执行的方法能不阻塞整个程序&#xff0c;将该方法丢入到线程池中让线程去做异步执行&#xff0c;既提高了程序整体运行速度&#xff0c;也使得在高并发环境下程序能够更加健壮&#xff08;同步执行可能会使得请求堆积以致系…...

对遗传算法思想的理解与实例详解

目录 一、概述 二、实例详解 1&#xff09;问题描述与分析 2&#xff09;初始化种群 3&#xff09;计算种群适应度 4&#xff09;遗传操作 5&#xff09;基因交叉操作 6&#xff09;变异操作 三、计算结果 四、总结 一、概述 遗传算法在求解最优解的问题中最为常用&a…...

数据可视化大屏——物流大数据服务平台(二)

代码分析&#xff1a; 物流大数据平台代码分析 这是一个基于 Bootstrap 和 ECharts 构建的物流大数据平台前端页面&#xff0c;设计采用了经典的三栏布局&#xff0c;主要展示河南省及全国的物流数据可视化内容。下面从多个维度进行分析&#xff1a; 1. 页面结构分析 整体采…...

MindSpore框架学习项目-ResNet药物分类-构建模型

目录 2.构建模型 2.1定义模型类 2.1.1 基础块ResidualBlockBase ResidualBlockBase代码解析 2.1.2 瓶颈块ResidualBlock ResidualBlock代码解释 2.1.3 构建层 构建层代码说明 2.1.4 定义不同组合(block&#xff0c;layer_nums)的ResNet网络实现 ResNet组建类代码解析…...

ChatTempMail - AI驱动的免费临时邮箱服务

在当今数字世界中&#xff0c;保护在线隐私的需求日益增长。ChatTempMail应运而生&#xff0c;作为一款融合人工智能技术的新一代临时邮箱服务&#xff0c;它不仅提供传统临时邮箱的基本功能&#xff0c;还通过AI技术大幅提升了用户体验。 核心功能与特性 1. AI驱动的智能邮件…...

(leetcode) 力扣100 9.找到字符串中所有字母异位词(滑动窗口)

题目 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 数据范围 1 < s.length, p.length < 3 * 104 s 和 p 仅包含小写字母 样例 示例 1: 输入: s "cbaebabacd", p &quo…...