js数组学习

数组的创建

数组里面可以包含任意的数据类型,不需要指定哪一种类型

var a=[]

访问数组的注意事项

1.var a=[1,2,,,]
a.length==4//注意长度不是5
2.访问不存在的项时,不会报错,会返回undefined
var a=[1,3,4]
a[4];//输出undefined
3.访问数组中的空项,也是返回undefined
var a=[1,2,,4]//有空元素的数组,叫做稀疏数组
a[2];//undefined

数组的长度

要清空一个数组,可以将数组的长度变为0

var arr = [1, 2, 3, 4, 5];
arr.length = 0;//清空数组,变成了空数组
console.log(arr);//arr[]
console.log(arr[0]);//undefined

如果数组的长度变为了arr.length=15,那么数组会变成arr[1,2,3,4,5, , , , , , , , , , ]
数组的长度会随着元素的增加而增加
遍历数组可以下面这种写法:

 var a=[1,2,3,4,['a','b']];
        var b=[];
        for(var i=0;i<a.length;i++){
            console.log(b.length);
            b[b.length]=a[i];//数组的长度会随着元素的增加而增加,会自动增加
            console.log(b.length);
        }
        console.log(a,b);

二维数组的遍历

var arr = [
  [2, 5, 8],
  [11, 22, 33],
  [55, 88, 66],
  [23, 56, 89],
];
for(var i=0;i<a.length;i++){
	for(var j=0;j<a[i].length;j++){
		console.log(a[i][j]);
]
}

数组类型的检测

Array.isArray();
Array.isArray([1, 2, 3]); // true
Array.isArray({ name: "清心老师", age: 18 }); // false
Array.isArray([]); // true

练习:

1.数组的翻转

思路一:创建一个空数组

 var a=[1,2,3,4,5,6,7];
        var b=[],j=0;
        for(var i=a.length-1;i>=0;i--){//a数组进行反向遍历
            b[j]=a[i];
            j++;
        }
        console.log(b)

思路二:双指针

 var a=[1,2,3,4,5,6,7];
 var i=0,j=a.length-1;//一个指针指向头,一个指向尾
        while(i<j){
        //不使用中间变量交换两个变量
            a[i]^=a[j];
            a[j]^=a[i];
            a[i]^=a[j];
            i++;
            j--;
        }
        console.log(a);

2.删除数组中指定的元素

数组的空间是连续的,元素不能删除,只能覆盖,删除一个元素,就得让其他元素向前移动
题目:删除数组中大于10的元素

分析:
会变的:数组的长度以及数组的下标
注意:在改变数组的长度的时候,不要把数组的长度赋值给另一个变量,然后让这个变量发生变化,这样子数组的长度并没发生改变

  var a=[1, 4, 12, 6, 33, 15, 30];
        //  var len=a.length;//注意:这里如果写的是len,下面改变的是len,不是数组的长度,所以这里不可以赋值给len 
           for(var i=0;i<a.length;i++){
                if(a[i]>10){
                    for(var j=i;j<a.length;j++){
                        a[j]=a[j+1];
                    }
                    // len=len-1;
                  a.length=a.length-1;
                    i=i-1;
                }
           }
           console.log(a);

随机生成指定范围内的颜色

思路:将颜色存储在数组中(范围),然后随机生成数组下标(随机)

<style>
        .ball{
            width: 100px;
            height: 100px;
            border-radius: 50%;
        }
    </style>
</head>
<body>
    <div class="ball" id="J_ball"></div>
    <script>
        var ball=document.getElementById("J_ball");
        var a=['blue','red','orange','pink'];
        var len=a.length;
        ball.style.backgroundColor=a[Math.random()*len>>0]//记得取整

    </script>
</body>

基本数据类型和引用数据类型(面试必问)

重点:存储方式不同
问题引入:为什么b的值没有发生改变,而arr2的值改变了

// 代码片段一
var a = 10;
var b = a;
a = 20;
console.log(a); // 20
console.log(b); // 10
// 代码片段二
var arr1 = [1, 2, 3, 4];
var arr2 = arr1;//这里复赋值的是地址,两个数组指向堆中的同一个地址
arr1[0] = "A";
console.log(arr1[0]); // A
console.log(arr2[0]); // A

基本数据类型是存储在栈中的,而引用数据类型则存储在堆中
代码片段一:
a和b两个变量对应的是两个不同的空间,改变a的值对b没有影响
在这里插入图片描述
代码片段二:
引用数据类型的存储方式

栈空间中存储着引用类型在堆空间中的地址,堆中存储着数据内容
在这里插入图片描述
分析:声明数组,会在栈中开辟两个空间,栈空间中存储着他们在堆中的地址,堆空间中存储着数据内容,因为指向的是同一个地址,所以当arr1修改了,即地址中指向的内容修改,所以arr2也会修改

数组的深克隆和浅克隆(面试必问)

1.var arr = [1, 2, 3, ["a", "b", "c"]];
2.var arr2 = [];
3.for (var i = 0; i < arr.length; i++) {
    arr2.push(arr[i]);//
}
console.log(arr); // [1,2,3,['更改','b','c']]
console.log(arr2); // [1,2,3,['更改','b','c']]
// arr 和 arr2是两个不同数组,其栈内存中指向堆内存的地址是不一样的
console.log(arr == arr2);
false;
// arr[3] 和 arr2[3] 是全等的,即两者指向堆内存中的同一个地址
console.log(arr[3] === arr2[3]); // true
// 修改arr[3][0]的值,arr与arr2中的同时都更新了
arr[3][0] = "更改";
console.log(arr); // [1,2,3,['更改','b','c']]
console.log(arr); // [1,2,3,['更改','b','c']]

在第三行代码中,将arr1中的每一个元素遍历,然后赋值给arr2,不是直接赋值地址,(arr2=arr1这种形式是直接赋值地址)
所以arr1和arr2是两个指向不同堆地址的数组,但是在遍历的时候,arr1中的第3个元素是直接赋值的,也就是两个地址是相同的,所以当改变arr1[3]的时候,arr2也改变,这就是数组的浅克隆
如果要深克隆,需要把["a", "b", "c"]每个元素都取出来,涉及到递归,后面讲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值