JS笔记(数组)


数组的概念: array
数组是一组【有序的】【变量】的【集合】。
数组的简单定义形式:
var 数组变量 = [数据1,数据2,…];
特点:
1:数组是我们接触到的第二种引用(reference)数据类型。数组的所有的数据在堆内存(heap)中。数据是连续的。
2:数组中的数据是有顺序的。有序号。序号是连续的,从0开始的。依次递增。最大到32bits的最大值 - 2。序号一般称为:索引(index)、下标、角标。
4: 数组中的数据一般称为元素(element);数组中的每个元素都是有下标的。
5: 数组访问元素,通过: 数组名[下标] (代表了数组中的一个变量)。
6:数组是一种特殊的对象。使用typeof 返回 object。
7: 数组是一种特殊的对象,也是键值对的集合。所有的键都是数值型的字符串。从0开始。
对象中的键都是字符串。
8:数组中的元素的类型可以是js支持的任意类型。元素可以重复。元素的数据类型可以不同。
9:数组有一个属性,length。代表了数组的元素的个数。是一个整数值。取值范围是[0~2**32 - 1],通过数组名.length 来访问该属性。 所以,元素的下标的取值范围是[0~length-1];

<script>
    var arr = [0,1,2,3,4,5,6,7,8,9];
    //length
    console.log (arr.length);//10
    //length的最大值。下标的最大值。2**32 - 2。
    arr.length = 2**32 - 1;
    //如果下标超过了length,那么就当做字符串来处理了。
    arr[2**32] = 100;

    var num = 10;
    num ++;
    num += 10;
    //之前的变量如何使用,数组的元素就如何使用。
    arr[0] ++;
    arr[0] += 10;
    console.log (arr[0]);//11
    console.log (arr["0"]);//11

    var obj = {
        "0":10,
        "1":11,
        "2":10
    };
    console.log (typeof arr);//object
    var arr1 = [
        1,
        "千万里我追寻着你",
        true,
        undefined,
        null,
        [1,2,true,null],
        function () {
            console.log ("hello");
        },
        {
            name:"刘",
            age:21
        }
    ];
    console.log (arr1[0]);
    console.log (arr1[1]);
    console.log (arr1[5][2]);
    arr1[6]();
    console.log (arr1[7].name);
    console.log (arr1[7]["name"]);
</script>

length

length:是数组的一个属性.
1: length 作为数组对象的一个特殊的key ,值是数组中键值对的个数。
是一个大于等于0的值。最大值为 2**32 - 1; 最小值为0.
该值不需要开发者来管理,数组这种数据类型底层自行维护。该值会
自动的调整,是一个动态的值。
最大值:4294967295
2:访问length属性的方式:数组名.length

3: 可以通过修改length属性的值,实现对数组的扩容和缩容。
    a:通过修改length属性,扩容。没有赋值的元素的值为:undefined
    b: 缩容,直接保留低索引的元素,超过数量的高索引元素直接被截断。
<script>
    var arr = ["a","b","c"];
    console.log (arr);
    console.log (arr.length);//3
    arr[3] = "d";
    console.log (arr.length);//4
    //修改length属性
    arr.length = 2**32 - 1;
    console.log (arr);
    console.log (arr[4]);
    //缩容
    arr.length = 2;
    console.log (arr);
    //中间有若干个元素没有赋值。中间的元素的值为undefined。
    //不建议使用如下的方式。
    arr[10] = "g";
    console.log (arr);
    console.log (arr.length);
    console.log (arr[5]);
</script>

数组的初始化方式:

1:表达式直接赋值的方式 (一般情况)
2:构造函数式 (少用的情况)

<script>
    //1  比较常用的方式。
    var arr = [1,2,3,4];
    var arr = [];
    arr[0] = 1;
    arr[1]  =2;
    arr[2] = 3;
    //2  构造函数方式
    //创建了数组对象,初始化元素个数为6,并指定了每个元素的值。
    var arr = new Array(1,2,3,4,5,6);
    console.log (arr);
    //创建了数组对象,初始化元素个数为6,每个元素的默认值为undefined。
    var arr = new Array(6);
    console.log (arr);
</script>

数组元素的操作:

增:
数组名[新下标] = 值;
会动态的修改数组的length属性。
删:
delete 数组名[删除元素的下标];
删除之后,该位置的值被删除,修改元素的默认值undefined。
不会修改length属性。
改:
数组名[下标] = 新的值;
查:
数组名[下标];

<script>
    var arr = ["a","b","c","d"];
    //增加元素的操作
    arr[4] = "e";//下标连续增加
    arr[10] = "x";//下标不连续,中间会有undefined的元素。
    // ["a", "b", "c", "d", "e", empty × 5, "x"]
    console.log (arr);
    //删除某个元素
    delete arr[3];
    console.log (arr);
    //修改
    arr[1] = "B";
    console.log (arr);
    //获取
    console.log (arr[0]);
</script>

数组的传引用

基本数据类型作为参数,传参的过程:给形参分配内存,并将实参的【值】赋值给形参的过程。
传值的过程。pass by value。

数组作为实参,参数传递介绍:
数组是引用数据类型,数组变量保存的是数组对象的引用(地址)。
数组作为参数,传参的过程是:给形参分配内存,并将实参的【引用】赋值给形参的过程。
传引用的过程:pass by reference。
<script>
    var arr = [1, 100];
    //交换数组中的两个元素的值
    function change(arr) {
        arr[0] = arr[0] ^ arr[1];
        arr[1] = arr[0] ^ arr[1];
        arr[0] = arr[0] ^ arr[1];
    }
    change (arr);
    console.log (arr);
    //传值的例子
    var num1 = 10;
    //将num1的值赋值给了num2.
    var num2 = num1;
    num2++;
    console.log (num1);//10 没有变
    console.log (num2);//11 变了。
    var arr1 = [1];
    //将arr1的引用赋值给了arr2.
    //arr1 和 arr2 同时指向了同一个对象。
    var arr2 = arr1;
    arr2[0]++;
    console.log (arr1);//[2];
    console.log (arr2);//[2];
</script>

数组的遍历

遍历数组的方式:
1:基本的for循环 使用最多的一种。
2: for in 循环。用来遍历对象。
3:for of 循环。
4:for-each 实例方法

<script>
    var arr = ["a", "b", 'c', "d", "e", "f", "g"];
    const LEN = arr.length;
    //1 使用基本的for循环遍历数组的元素
    for (let i = 0; i < LEN; i++) {
        console.log (arr[i]);
    }
    console.log ("-----------------");
    //2 for in 循环  i代表了数组元素的所有的下标。
    for (var i in arr){
        console.log (arr[i]);
    }
    console.log ("-----------------");
    //3 for of 循环  不能直接得到ele元素所对应的下标。
    for (var ele of arr){
        console.log (ele);
    }
    console.log ("-----------------");
    //4 for-each 遍历 实例方法,想遍历哪个数组,就用哪个数组对象去调用该方法
    var fn = function(ele,index){
        //ele : 数组的元素。
        //index 是ele的元素的下标。
        console.log (`第${index+1}个元素是:${ele}`);
    };
    arr.forEach(fn);
    console.log ("-----------------");
    arr.forEach(function(ele,index){
        //ele : 数组的元素。
        //index 是ele的元素的下标。
        console.log (`第${index+1}个元素是:${ele}`);
    });
    console.log ("-----------------");
    arr.forEach(function (ele,index) {
        console.log (`第${index+1}个元素是:${ele}`);
    });
</script>

类数组对象

类数组对象:类似于数组对象的对象。
类数组对象的条件:
1:所有的key都是数值型的字符串。
2:还有length属性。

类数组对象和数组对象的区别:
    1:length属性的区别。数组的length 是动态的。
        类数组对象的length,不会自动修改个数。
    2:数组作为js的内置数据类型,js提供了大量的操作数组的方法供它使用。
        类数组对象是不存在这些函数的。

相同点:
    1:都是对象
    2:都可以添加非数值型的键key。数组中添加非数值型的键,不会影响length属性。

补充:
    可以通过一个函数来判断任意对象是否是数组对象。
    Array.isArray(obj); 如果obj是数组返回true,否则返回false。
<script>
    var obj = {
        0 : "a",
        1 : "b",
        2 : "c",
        length:3
    };
    console.log (Array.isArray(obj));//false
    console.log (obj[0]);
    console.log (obj[1]);
    console.log (obj[2]);
    obj[3] = "d";
    console.log (obj.length);
    //给对象添加属性。
    obj.name = "对象";
    console.log (obj);
    //给数组添加非数值型的key。不会影响数组的长度。
    var arr = ["a","b"];
    arr.name = "数组";
    console.log (arr);
    console.log (arr.length);
    console.log (Array.isArray(arr));//true
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值