JavaScript数组 - 引用详解
基本数据类型详解
在学习数组引用详解前,我们先来看基本数据类型的详解
举个小例子:
我们声明一个a = 10;
然后声明一个函数,这个函数里面有个参数为a
把这个参数的a改成5,a = 5; 并且再加上alert(a);
函数外我们先去alert(a);
再调用这个函数把a写在里面传进去
再来一次alert(a);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type = "text/javascript">
var a = 10;
function show(a){
a = 5;
alert(a);
}
alert(a); //10
show(a);//5
alert(a); //10
</script>
</head>
<body>
</body>
</html>
我们来看一下这三次调用的结果
第一次输出结果为10,第二次是调用的函数输出的结果为5,第三次输出的结果还是10
show函数调用的结果只限于这个范围
说明:
声明在当前函数中的变量和当前函数的形参,作用域都限制在该函数内
当函数调用结束以后,这些变量和形参可,会被释放
我们来分解看一下
首先红框中定义的a=10; 没有调用函数,并且alert输出的也是10,这个毫无疑问
在函数中,首先定义函数时,function show(a)这里面a的值首先被赋值成10;但是我们在函数体内把这个a的值修改为了5;这时的a就为5
函数调用结束,就会被销毁,我们最后再去alert(a);时,就会找到第一次声明的a,即为10
这是关于基本数据类型的详解
数组引用类型详解
来修改一下上面的小例子:
如果按照基本数据类型的解释
第一个alert和第三个alert应该是输出相同的的10,20
中间的show(); 函数调用的是输出的10,20,30,40
实际运行的结果我们来看一下
首先第一个alert输出的是10,20没问题
但是调用函数的alert和最后一个alert输出的结果是相同的10,20,30,40
这是因为什么呢?这就是因为数组是一个引用的数据类型
数组:复合数据类型/引用数据类型
注意:函数运行的内存空间是预先分配好的;一旦被分配好内存空间,就不能进行改变了
所有的复合数据类型都不直接存储在我们的函数中,它是存储在堆段
在堆段,我们可以想用多少内存,就随时分配多少内存;
但是在函数中是预先分配好的,不能修改
在我们上面例子中,一开始声明的数组10和20并不是存在一个变量中,而是存在堆段中
一个变量是存不下这些数的,更何况我们还要继续往数组中增加数值
10和20在我们内存中是需要占空间的,我们打个比方来说,10和20就相当于在住宾馆,住宾馆肯定要有房间号吧,当我们想要找到它时只需要记住房间号即可;假设10,20的房间号为888,那么arr只需要记住这个房间号888,最终当我们访问这个arr时,首先访问的就是888号,然后才能找到10,20;
所以在第一次输出的时候是10,20
然后呢我们去执行show函数,show函数中有个形参也叫arr,我们在show的函数体内对arr进行了赋值操作,实际上就是给888号房间赋值,所以函数show的arr赋值后也为888号;然后我们又给888号房间用push增加了两个数30,40,30,40同样也存储在了堆段中。
所以第二次调用的show函数是10,20,30,40
当我们的show函数执行完毕后,show函数就被释放掉了,销毁了;但是当我们最后一个alert再去访问arr时,arr的房间号888所对应的堆段中已经是10,20,30,40了
所以第三次alert所输出的函数也是10,20,30,40
我们要记住,所有的复合数据类型所存储的方式都是一个门牌号,也就是地址,再通过地址去访问数据
即,这类型的数据我们叫做引用数据类型
理解了引用的概念后,我们就可以给冒泡排序和选择排序就可以对他进行封装函数
封装排序方法
利用排序中的例子来看
将循环放在函数体内
封装冒泡排序:
调用函数即可看到相应的排序
由于数组是引用数据类型,所以我们不需要return返回值
因为我们通过这种方式修改的数组就是原来的数组
封装选择排序:
将这两个排序写在一个新的js文件中
我们想要用到这两个排序算法的时候就可以直接引用这个两个函数bubble()和choose()
直接调用函数就ok