JS数据类型传参笔记
最近在学习JavaScript的时候遇到了简单和复杂数据类型传参的内容将笔记分享给大家
前言
首先我们知道操作系统会把内存分成两大类,简单数据类型是存放到栈里面的,复杂数据类型是存放到堆里面的。
一、简单数据类型和复杂数据类型是什么?
1.简单数据类型:又叫做基本数据类型或者值类型,在存储时变量中存储的是值本身,因此叫做值类型
如:(string,number,boolean,undefined,null)
2.复杂数据类型:又叫做引用类型,通过new关键字创建的对象(系统对象、自定义对象)
如:(Object、Array、Date)
二、案例说明
1.简单数据类型传参
简单数据类型是存放在栈里面,里面直接开辟一个空间存放的是值
(1)代码如下:
function add(b) {
b += 4;
console.log('b的值为:' + b);
}
var a = 10;
add(a);
console.log('a的值为:' + a);
(2)分析代码:
前面是函数声明,代码这里先执行var a = 10;这段代码,a这个变量在栈里面申
请了一个空间存的是10,a会指向这个10。然后下面的add函数调用了这个a的值也
就是10,把这个实参传递给add函数形参里面的b,然后b这个变量也就申请一个空
间存的也是10,b也会指向这个10,然后执行代码b+=4;就是b指向的值要加4此时
的10也就变成14执行完成后b的值也就变成了14。然后输出b的值为14,接下来到最
后一行代码输出a的值找到a变量指向的值是10不变所以输出10。所以简单数据类型
的传参是直接传值不会相互影响。
(3)图示:
(4)结果验证:
2.复杂数据类型传参
复杂数据类型就不一样了,首先是在栈里面存放地址用十六进制表示然后这个地址指向堆里面的数据
(1)代码如下:
function Student(grade) {
this.grade = grade;
}
function fn(b) {
console.log('b.grade的值为:' + b.grade);
b.grade = "大学";
console.log('b.grade重新赋值后的值为:' + b.grade);
}
var a = new Student("高中");
console.log('a.grade的值为:' + a.grade);
fn(a);
console.log('a.grade经过函数的值为:' + a.grade);
(2)分析代码:
首先一看代码里面前面两个函数声明,那么来到var a = new Student("高中");
这一段代码,一看有new就知道是复杂数据类型,首先有一个变量a在栈里面开辟
一个空间这时候存放的是地址,真正的new Student这个实例化对象是存放在堆里
面的。然后是输出语句找到a这个变量指向的地址,地址指向的是堆里面对象的
grade所以输出的是高中。然后调用了函数把a传给b,相当于是a=b,那么开辟
一个b的变量然后再栈里面也开辟一个空间里面存放的是和a一样的地址,由于
b指向的地址和a一样那么指向的都是堆里面的同一个对象。所以函数里输出
b.grader仍然是高中。下一行代码b.grade="大学";对这个grade进行了重新
赋值,所以这时对象里的grade值变成了大学,然后输出的b.grade就是大学了。
函数调用结束后最后到a.grade经过函数的值这一步,找到a变量,指向的地址
是指向堆里的对象然后grade已经变成了大学所以这里输出的是大学。所以复杂
数据类型传参的时候是把地址传过去了,形参和实参实际保存的是同一个堆地
址,操作的是同一个对象。
(3)图示(红色为改变后的值):
(4)结果验证: