JavaScript中:地址引用的特性,导致静态初始值被修改
JavaScript,值引用,地址引用
开发过程中,服务端将静态配置数据从mysql数据库中读取到内存中,方便调用。
在实现流派功能时,需从数据库中读取流派种类数据到内存中,由于其中generals字段的值是一个转成了字符串类型的数组,因此需要使用JSON.Parse()解析该字段值,如图:

在实现接口后调用,第一次成功,但是继续请求第二次,就会报错,报错来源是JSON.parse()这里。
从报错信息上看,是JSON.parse的对象类型不正确,导致无法parse,代码中generals的初始值等于'["zhubajie", "sunwukong", "niumowang", "jinjiao", "yinjiao"]',目前是要将该字符串解析成数组,第一次请求时,解析是成功的,但是第二次就失败报错,按设想是,每次请求时,
都取一次内存中的初始配置数据,而初始配置理应是不会变化的,这样保证每次都可以正确解析。
通过代码检查,看到了这段:
这里将preGeneralGroup的属性generals重新赋值为数组类型的值,会不会是这里改变了初始配置数据呢?
答案是会的,在JS中,有两种引用方式,一种是值引用,另一种是地址引用,其中:
* 数字、字符串、布尔类型的为原始类型,是值引用
* 数组、对象类型为地址引用
* 值引用 可以深拷贝
* 地址引用 循环到原始类型方可进行深拷贝
而不巧的是我们上面代码中的初始配置就是一个对象,如下图:
PreGeneralGroup类型定义:

因此下面这段代码,实际是地址引用:
这就导致了当preGeneralGroup中的属性generals类型被改变时,初始配置dataApi.preGeneralGroup.data对象中的generals属性也被改变了进而导致了报错的产生。
对需要引用的对象进行深度拷贝,不需要重新造轮子,可以直接使用现有工具包lodash中的cloneDeep()方法即可,如下图:

JavaScript中:地址引用的特性,导致静态初始值被修改的更多相关文章
- 深入理解JavaScript中的属性和特性
深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...
- 如何在Javascript中利用封装这个特性
对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,那么如何在Javascript中利用封装这个特性呢? 我们会把现实中的一些事物抽象成一个Class并且把事物的属性( ...
- JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)
经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...
- 如何在JavaScript中正确引用某个方法(bind方法的应用)
在JavaScript中,方法往往涉及到上下文,也就是this,因此往往不能直接引用,就拿最常见的console.log("info…")来说,避免书写冗长的console,直接用 ...
- Javascript中的undefined、null、""、0值和false的区别总结
在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBN ...
- 对 JavaScript 中的5种主要的数据类型进行值复制
定义一个函数 clone(),可以对 JavaScript 中的5种主要的数据类型(包括 Number.String.Object.Array.Boolean)进行值复制 使用 typeof 判断值得 ...
- JavaScript中函数引用调用和函数直接调用的区别
首先看下面的代码: var x = 1 var f1 = function( f ) { var x = 2 ; f( ' console.log( x ) ' ) } var f2 = funct ...
- 微信小程序:wx.navigateTo中url无法跳转问题(app.json中配置的tabBar与wx.navigateTo中url引用相同页面导致)
今天在做微信小程序时,设置wx.navigateTo页面跳转并传参数,点击始终没有效果,代码如下: //事件处理函数 newsDetail: function (event) { console.lo ...
- springboot在application.yml中使用了context-path属性导致静态资源法加载,如不能引入vue.js,jquery.js,css等等
在springBoot配置中加入上下文路径 server.context-path=/csdn js,img等静态文件无法加载,出现404的问题 <script type="text/ ...
随机推荐
- 性能优化(1+N,list与iterator,缓存,事务)
1.注意session.clear()的运用,尤其是不断分页循环的时候 A 在一个大集合中进行遍历,取出其中含有敏感字的对象 B 另一种形式的内存泄露. 2.1+N问题 问题描述:如@ManyToOn ...
- [Linux系统] (6)LVS负载均衡
部分内容转自:https://blog.csdn.net/weixin_40470303/article/details/80541639 一.LVS简介 LVS(Linux Virtual Ser ...
- BAT批处理设置Shift右键cmd菜单
Windows Registry Editor Version 5.00 [-HKEY_CLASSES_ROOT\Directory\shell\runas] [HKEY_CLASSES_ROOT\D ...
- jprofiler 监听远程java项目
1.下载.安装windows和linux版的jprofile.注意:若监控的是springboot.springcloud项目,切记本地和服务器上的jprofile要版本保持一致,本人亲自踩过坑. 官 ...
- socket 异步 发送 接收 数据
Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); / ...
- List集合的三个实现类比较
1. ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 2. Vector 底层数据结构是数组,查询快,增删慢 线程安全,效率低 3. LinkedList 底层数据结构是链 ...
- 5.聚类算法k-means
聚类与分类的区别在于,是在没有给定划分类别的情况下,更具数据相似度进行样本分组的一种办法,是一种非监督的学习算法,聚类的输入时一组未被标记的样本,聚类更具数据自身的距离或者相似度将其划分为若干组,划分 ...
- Scrum立会报告+燃尽图 02
本次作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9912 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名 ...
- http请求状态码解析
1xx(临时响应) 2xx(成功) 3xx(重定向) 4xx(请求错误) http状态码 400 (错误请求) 服务器不理解请求的语法. http状态码 401 (未授权) 请求要求身份验证. 对于需 ...
- android 播放音乐媒体文件(二)
MediaPlayer使用 官方文档: https://developer.android.com/guide/topics/media/mediaplayer.html 示例代码: 首先网络音频资源 ...