1.简介本文介绍了js中函数传参的问题。属于基础内容。您可以先检查以下练习。如果你能轻松完成它们,你就不需要往下读了。2.习题下面有6道题。问题1vara=[1];varb=a;b=[10]console.info(a)console.info(b)问题2vara=[1];varb=a;b[1]=10console.info(a)console.info(b)question3vara=[1];functionf(a){a=[10]}f(a);console.info(a)question4vara=1;functionf(a){a=10}f(a);console.info(a)问题5vara=[1];functionf(a){a[1]=10}f(a);console.info(a)问题6vara=[1];functionf(a){a[1]=10a=3;}f(a);console.info(a)答案:问题1:a:[1],b:[10]问题2:a:[1,10],b:[1,10]问题3:a:[1]问题4:a:1问题5:a:[1,10]问题6:a:[1,10]三、内容1.数据存储方式2.赋值运算符的含义3.参数传递的本质4.实例解释4.数据存储方式js中的数据类型分为两大类:基础数据类型和引用数据类型。不管是什么类型的数据,都需要有一个地方来保存数据的内容。我们在给变量赋值的过程中,就是在做保存的过程。在下面两行代码中,我们分别在两个变量中存放了一个基本数据类型data和引用类型data,vara=[10];变量b=1;我们先回顾一下数据存储的方式:基本数据类型的类型存储在栈区;引用数据类型的数据使用两个区域:地址信息存储在栈区,真正的数据存储在堆区,堆区的地址在栈区保存。5.赋值运算符的含义赋值运算符就是我们最常用的运算符:=。我们在写赋值运算符的时候,背后其实有很多工作要做。具体如下:5.1。右边是值varName=value;意思是将等号右边的值保存到等号左边的变量(或常量)中。幕后做了什么:检查等号左边的变量是否存在。如果这个变量不存在,是否允许创建。这一步没有问题,再往右看。找一个地方保存右边的值。这时候就需要根据右边的值是引用类型还是基本数据类型来决定如何保存了。如果是基本数据类型,则直接保存在栈区;如果是引用类型,先把数据存到堆区,再把地址存到栈区。5.2.右边是变量varName=var1;意思是将等号右边的变量保存的值赋给等号左边的变量(或常量)。就是直接赋值栈区保存的内容。5.3.示例让我们继续上面的代码:vara=[1];varb=a;//注意这句话是通过下标给b赋值的vara=[1];varb=a;b[1]=10;//在第二个元素中存储10。结果如下:a:[1,10],b:[1,10]vara=[1];varb=a;b[1]=10;b=[10];//保存6中的数字,函数中传入的参数6.1.本质上,在函数的调用过程中,有一个传值的过程。具体来说就是将实参的值传递给形参。我们可以这样理解这个过程:函数的形参就是函数内部定义的局部变量。实际参数传递给形式参数的过程是一个赋值过程。函数调用结束后,局部变量会被回收。6.2.例子让我们看一个例子vara=[1];functionf(a){a[1]=10a=[10]}f(a);console.info(a)我会一步步解释这个过程。初始情况下:调用f(a)时,相当于一个赋值操作:将全局变量a的值赋给局部变量a(赋值里面就是栈中的内容)。原来他们指的是一个数组。下面执行函数体中的第一句:下面执行函数体中的第二句。最后一步:函数调用结束,释放函数中的变量和对应的空间。函数调用后,空间被释放。局部变量a和f-heap中的数组都被回收了。此时访问的a是一个全局变量。7.总结基本数据类型只需要用到栈区;引用数据类型需要使用栈区和堆区;赋值是将右边的值保存到左边的变量中;赋值时传递的栈区内容;函数中的形参相当于函数内部的局部变量;实参传递给形参的过程就是赋值的过程;函数调用完成后,其局部变量会相应销毁,除非遇到特殊情况(如闭包)
