打卡 day 8 数组

数组

数组就是数据的集合

复杂数据类型 object

创建一个数组

字面量创建一个数组
  • 直接使用 [] 的方式创建一个数组

    // 创建一个空数组
    var arr1 = []
    
    // 创建一个有内容的数组
    var arr2 = [1, 2, 3]
    
内置构造函数创建数组
  • 使用 js 的内置构造函数 Array 创建一个数组

    // 创建一个空数组
    var arr1 = new Array()
    
    // 创建一个长度为 10 的数组
    var arr2 = new Array(10)
    
    // 创建一个有内容的数组
    var arr3 = new Array(1, 2, 3)
    
数组的索引

数组的下标 从0开始

var arr2 = [1, 2, 3]
// 1 2 3 
// 0 1 2  下面代表索引   1 的索引是0

数据类型之间存储的区别(重点)

  • 既然我们区分了基本数据类型和复杂数据类型
  • 那么他们之间就一定会存在一些区别
  • 他们最大的区别就是在存储上的区别
  • 我们的存储空间分成两种
  • 栈: 主要存储基本数据类型的内容
  • 堆: 主要存储复杂数据类型的内容

数组的常用方法

以下方法会改变数组

1.push 2.pop 3. unshift 4 .shift 5. reverse 6. sort 7.splice

以下不会改面数组

push() 添加数据 返回值 是添加数据之后 新数组的长度
pop() 删除数据 返回值 是删除的数组的最后的那一个数据

    //对结尾 
        // push() 添加数据  返回值 是添加数据之后 新数组的长度
        // pop() 删除数据 返回值 是删除的数组的最后的那一个数据
    
//   var num1=[1,2,3,4,5,6,7]
//    num1.push('季沧海');//1,2,3,4,5,6,7.季沧海
//    document.write(num1+'<br>') 
//    document.write(num1.push('季沧海'+'<br>'));//9
//    var num2=[1,2,3,4,5,6,7]
//    document.write('<br>');
//    document.write(num2.pop())//7
//    document.write('<br>');
//    document.write(num2)//1,2,3,4,5,6

unshift() 添加数据 返回值 是添加数据之后 新数组的长度
shift()删除数据 返回值 是删除的数组的第一个数据

//对开头
        // unshift() 添加数据 返回值 是添加数据之后 新数组的长度
        // shift()删除数据 返回值 是删除的数组的第一个数据

var num3=[1,2,3,4,5,6,7];

num3.shift()
document.write(num3) //2,3,4,5,6,7
document.write('<br>');
   document.write(num3.shift())//2    删除第一位 因为上面已经删除了1 所以删2
   document.write('<br>');

   var num4=[1,2,3,4,5,6,7];
   num3.unshift(1)
document.write(num3) //2,3,4,5,6,7
document.write('<br>');
   document.write(num3.unshift(1))//7     是添加数据之后 新数组的长度
   document.write('<br>');

sort() 按照每个数据 一位一位的对比 排序

 // sort() 按照每个数据 一位一位的对比 排序    不太重要

        //sort(function(a,b){return a-b})
        // var test = ['李白','安琪拉','猪八戒','韩信','李信','小乔','武则天']
        // var test = [119,20,5,67,27,48]
        // function haha(num1,num2){
        //     if(num1>num2){
        //         return -5; // 如果小于0 不交换位置
        //     }
        //     return 5; // 大于0 交换位置 
        // }
        // test.sort(haha) //因为 sort即可以排序数字 又可以排序字母
        // // 导致 直接排序数字 或者直接排序字母 有可能不正确的情况 
        // // 需要手动干预  
        // // 需要传一个方法 函数进去  传函数名进去 不要() 

        // alert(test)

        // 默认是排序纯字母 

        // var test = ['g','a','r','p','x','o']
        // test.sort()
        // alert(test)
        // sort 不要排序数字  非要排序数字  那么需要干预一下 写个

reverse() 翻转

   // reverse()  翻转
        var num5=[1,2,3,4,5,6,7];
        num5.reverse()
        document.write(num5);

splice() 专门用来截取数组

 // splice() // 专门用来截取数组 

     //一个方法完成了数组的增删改 
        //数组.splice(开始的索引位置,0,新元素1,...新元素n) 增
        //数组.splice(开始的索引位置,删除的个数) 删 
        //数组.splice(开始的索引位置,删除的个数,替换的元素1,...元素n) 改 
        document.write('<br>');
        var num6=[1,2,3,4,5,6,7];
     num6.splice(1,0,'w');// 从第二个位置前面 增加 w
     document.write(num6)

  1. concat()
    + 语法: 原始数组.concat(数1, 数2, 数据, …)
    + 作用: 进行数组拼接, 把参数的所有数组或者数据, 拼接在原始数组身上
    + 返回值: 拼接好的数组
    + 和 push 的区别
    => 改变原始数组
    -> push 直接改变原始数组
    -> concat 不会改变原始数组
    => 插入数据
    -> push 直接把数据插入
    -> concat 如果遇到数组, 会把数组拆开, 把每一个数据依次插入


 var arr1 =  ['李白','安琪拉','猪八戒','韩信','李信','小乔','武则天']

    var res = arr1.concat([500,'周瑜'],'诸葛亮',['铁拐李','黄忠'])//在原有数组后面拼接。。。。
    document.write('原始数组',arr1,'<br>')
    document.write('拼接好的数组',res,'<br>')
    document.write('原始数组',arr1)
  1. join() 数组=>字符串
    + 语法: 数组.join(‘连接符’)
    + 作用: 使用连接符, 把数组内的每一个数据连接成一个字符串(不写默认使用 逗号)
    + 返回值: 连接好的字符串
    

     var arr2 =  ['李白','安琪拉','猪八戒','韩信','李信','小乔','武则天']
    var res2 = arr2.join('$') //就是在数组里面插入新的
    document.write('原始数组',arr2,'<br>')
    document.write('拼接好的字符串',res2,typeof(res2),'<br>')
    document.write('原始数组',arr2)

slice()



    //     + 语法: 数组.slice(开始索引, 结束索引)  [开始的索引,结束的索引)
    //     + 参数特点:
    //       => 包前不包后, 包含开始索引位置数据, 不包含结束索引位置数据

    //       => 开始所以不填, 默认是 0, 结束索引不填, 默认是 length

    //       => 可以填写负整数, 表示倒数第几个, 其实就是 length + 负整数
    //     + 作用: 截取数据的部分内容
    //     + 返回值: 必然是一个新数组
    //       => 内部就是截取出来的部分内容
    //     + 和 splcie 的区别
    //       => 改变原始数组
    //         -> splice 改变原始数组
    //         -> slice 不改变原始数组
    //       => 参数
    //         -> splice(开始索引, 多少个)
    //         -> slice(开始索引, 结束索引)

  document.write('<br>');
    var arr3 =  ['李白','安琪拉','猪八戒','韩信','李信','小乔','武则天']
    var res = arr3.slice(2,3);
    var res = arr3.slice(-6,-4); //截取的时候一定是从左往右截取 -6,-4  安其拉 猪八戒
    var res = arr3.slice(-1); // 截取数组的最后一个元素
    // var res = arr1.slice(-1,0); //默认是从左往右 -1 到0 是从右往左所以结果是空 

    // var res = arr1.slice(0,arr1.length);
    // var res1 = arr1.slice(0);// 有头无尾 不写尾代表你全要

    document.write('原始数组:',arr3,'<br>')
    document.write('截取的内容:',res,typeof(res),'<br>')
    // document.write('截取的内容',res1,typeof(res),'<br>')

    // document.write('原始数组',arr1)

    // 复制一个新的数组
    // push 到一个新空数组中

indexOf()/ lastIndexOf() 一个从前向后 一个从后向前

     //     + 语法:
    //       => 数组.indexOf(数据)
    //       => 数组.indexOf(数据, 开始索引)
    //     + 作用: 从前到后检索该数据第一次在该数组内出现的位置
    //     + 返回值:
    //       => 如果在数组内找到了该数据, 那么就是该数据第一次出现的索引位置
    //       => 如果在数据内没有找到该数据, 那么就是 -1
     var arr4 =  ['李白','安琪拉','猪八戒','李白','杜甫','韩信','李信','小乔','武则天']
    //元素的下标永不变 不管从哪里找 找到他 就是他不变的下标
    var res = arr4.indexOf('杜甫',5) // 从左往右找       第一次出现的位置  1 如果找不到 返回-1
    // 如果指定了第二个参数 表示从下标五开始往右查找 找不到 -1 
    var res1 = arr4.lastIndexOf('杜甫',5) // 从右往左找     第一次出现的位置 3 如果找不到 返回-1
    // 如果指定了第二个参数 表示从下标五开始往左查找 返回 找到返回元素所在数组的下标 找不到 -1     
    alert(res) ;
    alert(res1);

数组的排序

冒泡排序
  • 先遍历数组,让挨着的两个进行比较,如果前一个比后一个大,那么就把两个换个位置
  • 数组遍历一遍以后,那么最后一个数字就是最大的那个了
  • 然后进行第二遍的遍历,还是按照之前的规则,第二大的数字就会跑到倒数第二的位置
  • 以此类推,最后就会按照顺序把数组排好了
for (var j = 0; j < arr.length - 1; j++) {
  for (var i = 0; i < arr.length - 1 - j; i++) {
    // 判断,如果数组中的当前一个比后一个大,那么两个交换一下位置
    if (arr[i] > arr[i + 1]) {
      var tmp = arr[i]
      arr[i] = arr[i + 1]
      arr[i + 1] = tmp
      document.write(arr+'<br>')
    }
  }
}

数据类型复制的区别

 // var a = 100; //在栈内存开辟一个独立的空间
        // var b = a; //  先给b在栈内存开辟一个空间 然后a中的100 给到 b 
        // 两个空间各自独立  基本数据类型储存在栈内存  复杂数据类型在堆内存

        //'hello' 100 原数据用不改变 


        // alert(a);  // 100
        // alert(b); // 100

        // b = 200;
        // alert(a); //100 修改b 不影响a 
        // alert(b); //200 

        var a = {name:'**'} // 栈内存中开辟空间 起名a  堆内存开辟空间

        var b = a;  // 栈内存开辟空间b 堆内存的地址赋值给a  ab共用一个堆内存地址
        console.log(a.name)
        console.log(b['name'])

        b.name = '***'  // 所以修改b 就会影响a
        console.log(a.name)
        console.log(b['name'])




t(a); //100 修改b 不影响a
// alert(b); //200

    var a = {name:'**'} // 栈内存中开辟空间 起名a  堆内存开辟空间

    var b = a;  // 栈内存开辟空间b 堆内存的地址赋值给a  ab共用一个堆内存地址
    console.log(a.name)
    console.log(b['name'])

    b.name = '***'  // 所以修改b 就会影响a
    console.log(a.name)
    console.log(b['name'])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值