值传递
- JS中的变量都是保存到栈内存中的
- 基本数据类型的值直接在栈内存中存储,
值与值之间是独立存在,修改一个变量不会影响其他的变量
a++之后,b的值还是123
引用传递
- new一个对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟一个新的空间
- 而变量是保存在栈内存中的,栈内存中变量的值是指向堆内存中对应对象的指针
而新建一个obj2 = obj;其实就是在栈内存中新建一个变量obj2,然后它的值也是和obj值一样的指针,指向堆内存中同一个区域罢了。
而修改obj的属性值,相当于修改堆内存中的内容,所以,当我们再输出obj2的属性值时,就发生了改变。
<!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>
引用对象之间的比较
<!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>
之所以console.log(obj == obj2)输出为false,因为比较的是栈内存中的值,为两个指向不同的指针,所以输出为false