原始值和引用值的存放数据的位置不同
原始值的数据存在栈stack中,原始值相互赋值就相当于拷贝一样,其中改变某一个变量的值,结果是变了的;而引用值得数据存在堆内存heap中,栈存放着目标堆内存的地址,引用值的相互赋值就相当于地址的赋值,指向同一个堆内存,之后结果不变的。下面就以一个例子来说明:
原始值:
<%--
Created by IntelliJ IDEA.
User: LENOVO
Date: 2019/9/13
Time: 15:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script type="text/javascript">
var a = 10;
var b = a;
a = 20;
document.write(a,b)
</script>
</head>
<body>
$END$
</body>
</html>
输出结果:2010 .之前a值是10,而把a的值拷贝给b,之后再改a的值为20.所以a=20,b=10.
原理:一个栈取名a,存储的数据时10;一个栈取名b,存储的数据是b = a.之后会再申请一个栈取名也是a,存储的数据是20.之后第一个a就返回之前未占用的栈了。就是相当于释放了第一个a的栈了。遵循的js原始值的基本语法。如图:
引用值:
<%--
Created by IntelliJ IDEA.
User: LENOVO
Date: 2019/9/13
Time: 15:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script type="text/javascript">
var a = [1];
var b = a;
b.push(2,3);
document.write(a,b)
</script>
</head>
<body>
$END$
</body>
</html>
输出结果:1,2,31,2,3. 数组a中只存储1,【1】是存储在堆内存中,而a是栈内存,栈中存储的是堆内存的地址。从而var b =a,是把a中的地址复制给b,之后b和a这两个栈都是存储这个地址,指向同一个堆。之后b在这个堆改变数据时,整个数组都会改变了的。所以打印a和b数组出来,它们的值都是一样的。如图分析: