44.基本数据类型和引用数据类型

值传递

  • JS中的变量都是保存到栈内存中的
  • 基本数据类型的值直接在栈内存中存储,
    值与值之间是独立存在,修改一个变量不会影响其他的变量
    44.基本数据类型和引用数据类型
    a++之后,b的值还是123

引用传递

  • new一个对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟一个新的空间
  • 而变量是保存在栈内存中的,栈内存中变量的值是指向堆内存中对应对象的指针
    44.基本数据类型和引用数据类型
           而新建一个obj2 = obj;其实就是在栈内存中新建一个变量obj2,然后它的值也是和obj值一样的指针,指向堆内存中同一个区域罢了。
           而修改obj的属性值,相当于修改堆内存中的内容,所以,当我们再输出obj2的属性值时,就发生了改变。
    44.基本数据类型和引用数据类型
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>基本数据类型和引用数据类型</title>
		<script type="text/javascript">
			/* 
				基本数据类型
				String Number Boolean Null Undefined
				
				引用数据类型
				Object
				
				JS中的变量都是保存到栈内存中的,
					基本数据类型的值直接在栈内存中存储,
					值与值之间是独立存在,修改一个变量不会影响其他的变量
			 */
			
			//值传递
			var a = 123;
			var b = a;
			a++;
			console.log("a = "+a);//124
			console.log("b = "+b);//123
			//修改a的值不会影响b的值
			
			//引用传递
			var obj = new Object();
			obj.name = "小明";
			var obj2 = obj;
			obj.name = "小红";
			console.log("obj2的name:"+obj2.name);//小红
			//也就是修改obj的值会影响到obj2的值,这是引用传递
		</script>
	</head>
	<body>
	</body>
</html>

修改栈内存中的值

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>修改栈内存中的值</title>
		<script type="text/javascript">
			var obj = new Object();
			var obj2 = obj;
			obj.name = "杨杰学";
			console.log("obj2.name = "+obj2.name);//杨杰学
			console.log("----------------");
			
			obj2 = null;
			console.log("obj.name = "+obj.name);//杨杰学
			//这里obj.name的值还是“杨杰学”的原因是:
			//修改obj2 = null;只是修改了栈内存中obj2的值,把它原来的指针改成了null
		</script>
	</head>
	<body>
	</body>
</html>

44.基本数据类型和引用数据类型

引用对象之间的比较

<!DOCTYPE html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>引用对象之间的比较</title>
		<script type="text/javascript">
			var obj = new Object();
			var obj2 = new Object();
			obj.name = "shs";
			obj2.name = "shs";
			console.log(obj.name);//shs
			console.log(obj2.name);//shs
			console.log(obj == obj2);//false
			
			/* 
				当比较两个基本数据类型的值时,就是比较值。
				而比较两个引用数据类型时,它是比较的对象的内存地址,
					如果两个对象是一摸一样的,但是地址不同,它也会返回false
			 */
		</script>
	</head>
	<body>
	</body>
</html>

44.基本数据类型和引用数据类型
之所以console.log(obj == obj2)输出为false,因为比较的是栈内存中的值,为两个指向不同的指针,所以输出为false

上一篇:44. 通配符匹配 - LeetCode


下一篇:oracle字符串里面有通过逗号分隔的各个id,直接通过字符串获取id对应的name的字符串