首页 > 其他分享 >引入数据类型无过程值?

引入数据类型无过程值?

时间:2023-09-20 19:35:09浏览次数:28  
标签:arr obj name age 数据类型 引入 const message 过程

案列代码如下

//优秀学生案例
const obj = {name:'小红',age:18,message:'该学生成绩优异'}
//有些学生列表,但无学生评语,即message
const objList = [{name:'小红',age:17},{name:'小明',age:17},{name:'小绿',age:18},{name:'小蓝',age:17}]
//现在想让这个列表里的所有元素都具有message属性 const changeAge = ()=>{ const arr = [{}] objList.map((item,index)=>{ obj.age=item.age obj.name=item.name arr.push(obj) }) return arr } console.log(changeAge()) 

 

结果如下

 可以看出,结果代码期望的差距还是比较大的,明明我每次更改都push了,但是为啥都是最终值?中间那些小红和小明去哪儿了?

原因:

对象obj是引用数据类型,它们在栈中是以地址的形式存在的.只有在使用的时候才会去堆里面找结果.

我们对上述流程进行解析,其过程大致如下

1.申明一个变量obj,在堆中存一个对象数据{name:"小红",age:18,message:"该学生成绩优异"},然后把这个堆内存的地址,比如值是"1233jjA",给obj,所以obj在整个栈中都是以"1233jjA"的形式参与计算的.

2.当变量修改obj的值的时候,实际上堆里的值也被修改了,而且也是按顺序改了,但是push的时候push的是地址,即"1233jjA"

这一步,会读取堆里的值,并进行修改

    obj.age=item.age
    obj.name=item.name

 

但是这一步,是push的地址

arr.push(obj)

 

所以,最终的函数执行结果其实是["1233jjA","1233jjA","1233jjA","1233jjA","1233jjA"],而此时去读取该地址下的堆拿到的值就是最终态的值.

结论就是,引用数据类型确实没有中间态,因为一个地址只能有一个堆,其值在你拿的时候肯定是只有一个的.

 

解决方案:

用不同的内存去保持过程值.

简单来说就是每次循环都声明一个对象,比如

//优秀学生案例
const obj = {name:'小红',age:18,message:'该学生成绩优异'}
//有些学生列表,但无学生评语,即message
const objList = [{name:'小红',age:17},{name:'小明',age:17},{name:'小绿',age:18},{name:'小蓝',age:17}]
const changeAge = ()=>{
  const arr = [{}]
  objList.map((item,index)=>{
    let newObj = {...item,message:obj.message}
    arr.push(newObj)
  })
  return arr
}
console.log(changeAge())

  

此处newObj就是每次循环单独声明的,虽然代码看上去每次循环都一样,但实际上每次的地址都是不一样的.

又比如:

//优秀学生案例
const stendents = {name:'小红',age:18,message:'该学生成绩优异'}
function Obj(obj){
    this.name=obj.name
    this.age=obj.age
    this.message= stendents.message
}
//有些学生列表,但无学生评语,即message
const objList = [{name:'小红',age:17},{name:'小明',age:17},{name:'小绿',age:18},{name:'小蓝',age:17}]
const changeAge = ()=>{
  const arr = []
  objList.map((item,index)=>{
    let newObj = new Obj(item)
    arr.push(newObj)
  })
  return arr
}
console.log(changeAge())

 

都是一样的效果,都是在循环时每次循环生成不同对象,然后将不同的地址push到arr里,最终打印的时候能拿到所有的值  

 

标签:arr,obj,name,age,数据类型,引入,const,message,过程
From: https://www.cnblogs.com/Shyno/p/17718181.html

相关文章

  • Redis的五中数据类型以及应用场景
    1.string字符串在redis中string是可以修改de被称之为动态字符串.其中内部更像arraylist内部维护一个字节数组,在其内部分配了一定的空间.内存分配机制当字符串的长度小于1m的时候,每次扩容都是加倍空间当字符串长度超过1m的时候每次扩容只会扩张1m的空间字符串的最大长度......
  • Java学习一路-Demo01-Java数据类型
    packagecom.chao.base;publicclassDemo01{/*Java数据类型两大类:基本数据类型和引用类型1.基本数据类型共8种:(1)数值类型分为:整数类型(4种):a.byte(字节型),占1个字节,取值范围(-128~127)b.short(短整型),占2个字节,取值范围......
  • 14-2 OSPF默认路由引入实验
    实验一会配置OSPF下发默认路由,一般在出口设备配置下发默认路由,出口连接运营商,通过下发默认路由将数据引导至出口设备,再转交给运营商拓扑AR2模拟运营商配置PC1配置LSW1配置<Huawei>sys[Huawei]sysLSW1[LSW1]vlanbatch1020[LSW1]integi0/0/2[LSW1-GigabitEth......
  • JS实现table动态生成过程中,移动行checkbox值丢失问题的解决
     最近在做项目过程中遇到这样一个疑问:(查看实例代码TEST1)DHTML中table对象的moveRow方法实现对table中表格行移动到新位置。例子TEST1中行2包含文本框、复选框、下拉框,当分别键入值后对行2执行上移操作后,我们发现,文本框与下拉框的值不会丢失,但复选框值会丢失。而如果在行2中键......
  • css字体---跨站引入报跨域问题【解决方法】
    最近遇到一个问题,考虑到网站的性能,需要将图标字体单独放到一个网站引入,减少资源占用,但是遇到一个问题,引入字体文件的时候,报跨域的错误。具体解决方法:将图标字体转base64转换网址:https://transfonter.org/按照以下三个步骤进行操作: 然后下周这个: 里面有个:stylesheet.cs......
  • java.lang.IllegalArgumentException: Malformed \uxxxx encoding — 记一次mvnDebug
    本文唯一发布网站博客园(官网地址:https://www.cnblogs.com/)本文地址:https://www.cnblogs.com/zeromi/p/17716933.html前情提要有天需要写个东西,需要翻一下老代码,使用idea打开一个很久没打开的项目,然后不知道为啥到处飘红在查看了项目的ExternalLabraries列表,发现包都有,再看......
  • OSPF路由引入
    路由引入原因由于不同路由协议之间的路由算法、机制、开销等不同,不同的路由协议之间无法直接分享彼此的路由;此时就需要通过路由引入技术将某个路由协议的路由引入到另一个路由协议中也可以相同路由协议之间引入RIP与OSPF引入位置在ASBR路由器执行引入指令OSPF引入RIP[R8]ospf......
  • 如何注释掉所有没用的引入呢
    如何注释掉所有没用的引入呢R-sz于2023-04-2500:01:58发布55 收藏文章标签:springboot版权如何注释掉所有没用的引入呢 在IntelliJIDEA中,可以使用OptimizeImports功能来注释掉所有未使用的引入。具体操作如下:1.打开Java文件,点击菜单栏中的Code->OptimizeImports......
  • STP生成树选举过程
    STP2说明BridgeProtocolDataUnits(BPDU)特殊的数据包一般有两种类型的BPDU,MACAddress:“0180.C200.0000"802.1DSTP–RootBridge(最老版本的STP)思维导图一、学习算法选举端口1.为什么要选举端口在一个网络中有多台交换机连接会产生环路、广播风暴、未知单播帧。......
  • 数据类型拓展及面试题
    publicclassDome03{publicstaticvoidmain(String[]args){//整数的拓展:进制二进制0b十进制八进制0十六进制0x//0b开头是二进制;0开头是八进制;0x开头是十六进制inti=10;inti2=010;//八进制0inti3=0x10;......