概念
数组概念: 数组也是object数据类型的一种,也是一种比较复杂的数据 一个大空间存储多个小空间
跟{}定义的对象区别: ①object中的数据没有顺序,数组中的数据是有顺序的
数组是计算机内存中一段连续的有顺序的空间,是使用一个变量来表示了
数组定义
var arr = []
var arr = new Array
var arr = [数据,数据,..]
var arr = new Array(数据,数据,...)
①如果使用[]的定义,放入一个数字,表示当前数组中只有一个小空间,其中放了这个数字,如果使用new Array(数字),表示当前数组中有 数字 个空的小空间
②数组的第一个元素的下标永远是0
③数组的最后一个元素的下标永远是 数组.length-1
④求数组长度>数组.length
数组的操作
①获取数组数据> 数组[下标]
②设置数据> 数组[下标] = 值 (当下标存在了,就是修改数据,下标不存在,就是添加,如果下标很大,会创建很多空的小空间)
③删除数据:<1>delete 数组[下标]; <2>数组.length = 值
数组的遍历
①循环语法遍历
②使用for in 也可以遍历,但是建议使用 i = 0 的for循环
数组练习
根据数据渲染页面
数组嵌套
数组中数据的类型是没有要求的,所以数组中可以嵌套数组 =>获取值:数组[下标][下标]
数组的基础类型和引用类型
<1>基础类型/简单类型:
①包含的数据:number/string/boolean/undefined/null
②存储 =>将值存在栈中
③赋值 => 将值复制一份给另一个变量
④全等比较 =>比较类型和值
<2>引用类型/复杂类型:
①包含的数据:{}/[]/function
②存储 => 将值存在堆中,将堆的地址存在栈中
③赋值 => 将栈中的地址复制一份给另一个变量 => 两个变量共用一个值的地址,改变一个,;另一个也会发生改变
④全等比较 => 比较栈中的内存地址是否一致
注意
①一旦碰到赋值操作,特别的注意一下,是否是引用类型赋值
②实参给形参赋值,也要小心是否是引用类型的赋值
③return出来的数据赋值给一个变量的时候,也要小心是否return了一个引用数据类型
数组的方法
unshift =>给数组开头添加一个或多个元素: 数组.unshift(一个或多个元素) =>返回数组的长度 ,改变原数组
shift => 将数组第一个元素删除: 数组.shift() => 返回被删除的元素,改变原数组
push => 给数组末尾添加一个或多个元素: 数组.push(1个或多个元素) =>返回新数组的长度,改变原数组
pop =>将数组最后一个元素删除: 数组.pop() => 返回被删除的元素,改变原数组
splice => 对数组做增 删 改的操作:数组.splice(开始下标,删除个数,要填充的1个或多个元素) =>返回被删除的数组,改变原数组
reverse => 翻转数组: 数组.reverse() =>不需要返回值,改变原数组
concat => 将1个或多个值或1个数组或多个数组合跟当前数组并成一个更大的数组: 数组.concat(1个或多个值 或1个数组或多个数组) =>返回更大的数组
sort => 对数组进行排序:①数组.sort();②数组.sort(function(a,b){return a-b/b-a});不需要返回值,改变原数组
jion => 使用指定的连接符将数组所有元素连接成一个字符串: 数组.jion(连接符) ,返回字符串
slice => 截取数组: 数组.slice(开始下标,结束下标) =>返回截取出来的数组片段组成新的数组,结果不包含结束下标对应的元素
排序算法
冒泡排序
for(var i=0;i<arr.length-1;i++){
for(var j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
var tmp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
每相邻的两个元素比较大小,排列出合适的顺序
选择排序
for(var i=0;i<arr.length-1;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
var tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
}
}
找最大值或最小值排列在合适的位置,得到新的顺序