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/ ...
随机推荐
- CNN简略总结
https://blog.csdn.net/real_myth/article/details/51824193 池化层的作用: 感受野变化...?? 1*1卷积核的作用 1. 实现跨通道的交互和信息 ...
- 【leetcode】1262. Greatest Sum Divisible by Three
题目如下: Given an array nums of integers, we need to find the maximum possible sum of elements of the a ...
- 2-SAT (two-statisfiability) 算法 学习笔记
$2-SAT$问题指的是对于若干限制求出一组可行解的问题. 考虑对于$n$个值域为${0,1}$的变量$x_1 , x_2 ,...,x_n$ 满足若干限制: 若 $x_i = p$ 则 $x_j = ...
- Windows安装MongoDB .zip绿色版
本文链接:https://blog.csdn.net/HTouying/article/details/88428452 MongoDB官网下载链接:https://www.mongodb.com/d ...
- Qtcreator 之中文目录
由于编码格式问题, qtcreator 所有关于目录的引用和存放均不出现中文,否则编译可以通过,运行时 crashed !!!
- openwrt python27库的选择和库的大小
< > micropython................................................. Micro Python < > microp ...
- Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2) G1. Into Blocks (easy version)
题目:https://codeforc.es/contest/1209/problem/G1 题意:给你一个序列,要你进行一些操作后把他变成一个好序列,好序列的定义是,两个相同的数中间的数都要与他相同 ...
- python学习之路(6)
使用dict和set Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根 ...
- 缓存区溢出之slmail fuzzing
这是我们的实验环境 kali 172.18.5.118smtp windows2003 172.18.5.117 pop3 110 smtp 25 本机 172.18.5.114 已经知道slma ...
- 误删系统服务Task Schedule的恢复方法
cmd命令 sc query Schedule查询该服务是否存在 sc delete Schedule删除服务 sc create Schedule binpath= "C:\Windows ...