js-数组、类数组

js-数组

数组的定义

  1. new Array(length/content)
  2. 字面量
  • 区别:当只传一个参数时,new Array会把参数当成是长度,即创建一个限定长度的值为undefined的数组;字面量则认为这一个参数是数组第一个元素。
//数组的定义
    var arr = [1,2,3];//数组字面量
    var arr1 = new Array(1,2,3,4,5);
    
    var arr2 = new Array(10);//[object Array]: [, , , , , , , , , ];length: "10"
    var arr3 = [10];//[object Array]: [10];length: "1"

数组的读和写

  • 读:arr[num];//不能溢出读,结果为undefined
  • 写:arr[num] = xxx; //可以溢出写

数组常用的方法 (基于ES3.0)

1.改变原数组
- push, pop, shift, unshift, reverse,sort
- splice

//数组常用的方法
    //1.push--在数组末尾添加元素
    var arr = [1,2,3];
    Array.prototype.push = function(num){
      for(var i = 0;i < arguments.length; i++){
        this[this.length] = arguments[i];
      }
      return this.length;
    }
    arr.push(4,5,6);//[1,2,3,4,5,6]
	
    //2.pop--从数组后面剪切最后一个元素,返回被剪切的元素
    arr.pop();//[1,2,3,4,5]
	
    //3.shift--从数组前面剪切
    arr.shift();//[2,3,4,5]
	
    //4.unshift--从数组前面插入
    arr.unshift(0,0);//[0,0,2,3,4,5]
	
    //5.reverse--数组元素反转
    arr.reverse();//[5,4,3,2,0,0]
	
    //6.splice--截取数组,在特定位置添加元素;arr.splice(从第几位开始,截取几位,在切口处添加新的数据);
    arr.splice(1,3,0,0);//[5,0,0,0,0]
	
    //7.sort--数组元素排序
    var arr1 = [2,3,1,-1,0,9];
    arr1.sort();//[-1,0,1,2,3,9]
    var arr2 = [1,3,4,2,10];
    arr2.sort();//[1,10,2,3,4];按ASCII码排序
      //重写sort函数:1)一定要写两个参数;2)看返回值:①当返回值为负数时,那么前面的数放在前面;②为整数,后面的数放在前;③为0,不动
    arr2.sort(function(a,b){
      return a<b?-1:1;//return a-b;//升序
      //return a>b?-1:1;//return b-a;//降序
    });
	
	//sort方法的其他拓展
	//给一个有序的数组返回随机的乱序数组
    var arr3 = [1,2,3,4,5,6];
    arr3.sort(function (a,b){
      return Math.random()-0.5;
    });

    var chen = {
      name:"chen",
      age:10,
      gender:"female"
    };
    var cheng = {
      name:'deng',
      age:30,
      gender:'undefined'
    };
    var he = {
      name:'he',
      age:40,
      gender:'male'
    };
    var arr4 = [chen,he,cheng];
    arr4.sort(function(a,b){
      return a.age - b.age;
    });

    var arr5 = ['a','sdffeee','df陈陈陈陈','dweshyrrebe','dfrfa'];
    arr5.sort(function(a,b){
      // return a.length-b.length;//按字符串长度排序
      return retBytes(a)-retBytes(b);//按字符串字节长度排序
    });
    function retBytes(a){
      var cnt = 0;
      for(var i = 0;i < a.length;i++){
        (a.charCodeAt(i)>255) ? ++cnt : cnt;
      }
      var res = a.length + cnt;
      return res;
    }

2.不改变原数组

  • concat, join --> split, toString, slice
//不改变原数组
    //1.concat
    var arr = [1,3,4];
    var arr1 = [4,5,6,9];
    var arr2 = arr.concat(arr1);
    console.log(arr);//[1,3,4]
    console.log(arr1);//[4,5,6,9]
    console.log(arr2);//[1,3,4,4,5,6,9]
	
    //2. toString -- 把数组重写成字符串
    toString(arr);
    console.log(arr);

    //3. join--把数组用特定字符连接成字符串
    var str = arr.join("-");//"1-3-4"
    str = arr.join("");//"134"

    //4. split--把字符串分割成一个字符串数组
    var str1 = 'andnjhskj,sjvshv';
    console.log(str1.split(','));//["andnjhskj","sjvshv"]
    console.log(str1.split(',',1));//["andnjhskj"]

    //5. slice--从已有数组中返回选定的元素
    var arr3 = [1,2,3,4];//arr.slice(开始截取的位置,直到这一位之前)
    console.log(arr3.slice(1,3));//[2,3]

类数组

  • 类数组 --> 属性要为索引属性,必须要有length属性,最好加上push。
    var obj = {
      "2":"a",
      "3":"b",
      "length":2,
      "push":Array.prototype.push,
      "splice":Array.prototype.splice
    }
    obj.push("c");
    obj.push("d");
  console.log(obj);//[obj] = {"2":"c","3":"d","length":4,"push":Array.prototype.push,"splice":Array.prototype.splice}
  //因为Obj的push是根据length对应的位置添加的,而原对象里面的length=2,即第一个元素的key名称。

    //push 原理
    Array.prototype.push = function push(target){
      obj[obj.length] = target;
      obj.length++;
    }
 
原文地址:https://www.cnblogs.com/1549983239yifeng/p/14431132.html