JS中对象与数组的初步使用

124 阅读6分钟

对象

一、认识对象

  • 是键名和键值的集合
  • 键名系统识别成字符串,且键名唯一不可重复。
  • 键值可以为任意类型,可以重复

二、创建对象

1、字面量创建对象

        var obj = {name:"张三",age:20};
        console.log(obj);
        //注意 : 键名 : 1.字符串类型 2.引号可以加也可以不加,一般不加。 3.键名不能重复 。键值 : 可以任意类型 ;
        let obj = {
            "name":true,
            "age":20,
            fn:function(){
                console.log("fn")
            },
            a:undefined,
            b:null,
            a:20,
            myage:20
            // null:"hello"
        }
        console.log(obj);

2、内置构造函数创建对象

  • 构造函数
    
        // 构造函数 其实就是一种特殊的函数,一般约定俗成(不是js的语法规则,大家协商好的规则)首字母大写;通过new 来调用函数;

        function fn(){           // 普通函数
            console.log("fn");
        } 
        fn();
        function Person(){       // 构造函数
            console.log("person")
        }  
        new Person;
  • 内置构造函数创建对象
    
        var obj = new Object();
        var obj1 = new Object({name:"zhangzhang",age:18});

3、通过工厂模式创建对象

        function Factory(){
            let obj = {};// 添加原料 ;
            obj.name = "zhangsan";// 加工原料 ;
            obj.age = 18;
            return obj; // 出厂;
        }
        
        var obj = Factory();

4、自定义构造函数创建对象

        function Person(){
            this.name = "zhangsan"; // this 会指向实例化之后的对象
            this.age = 18;
        }
        //new 实例化
        let obj = new Person();

三、获取对象的键值

1、通过 对象.键名 获取

        var obj = {
            myname:"张三",
            age:20,
            fn:function(){
                console.log("fn")
                return "hello";
            }
        }
        console.log(obj.myname);
        console.log(obj.fn());

2、通过 对象["键名"] 获取 (写键名记得写"",可以传变量名)

        var obj = {
            myname:"张三",
            age:20,
            fn:function(){
                console.log("fn")
                return "hello";
            }
        }
        // obj.myname 等同于  obj['myname'];
        console.log(obj['myname'])  //obj.myname;
        obj['fn']();

3、两种方法的区别

    //中括号 可以解析变量 ,但是 .语法不能解析变量;
        var str = "myname";
        var obj = {
            myname:"张三",
            age:20
        }

    // console.log(obj.str); // undefined 等同于 obj['str'];
    console.log( obj[str]);  // 等同于  obj['myname'];

四、对象的删除和修改

1、删除 使用delete关键字删除

       var obj = {
            myname:"张三",  // 字段 ,属性;
            age:20,
            height:"180cm"
        }

        // console.log(obj);
        delete obj.height;  // 删除obj里的height 属性;
        delete obj.age;
        console.log(obj);

2、修改-在原来对象上直接修改

        对象.键名 = 键值 
        对象[键名] = 键值;
        var obj = {
            myname:"张三",
            age:20,
            height:"178cm"
        }

        obj.myname = "李四";  // 修改原来对象的myname属性;
        obj.myhobby = "篮球"; // 如果之前没有这个属性,会追加;
        obj['age'] = 30;
        var myheight = "height";
        obj[myheight] = "180cm";
        console.log(obj);

3、修改-覆盖修改

    var obj = {
            name:"张三",
            age:20
        }

        obj = {
            name:"张三",
            age:20,
            height:"178cm"
        }
        console.log(obj);

五、对象的循环

使用 for in 循环遍历对象

    var obj = {
            name:"张三",
            age:20,
            height:"178cm"
        }

    //    可以通过 for ... in  .. 循环对象;
    // for  key in obj ;  key 键名;

    for(var key in obj){
        // console.log(obj.key) 等同于  obj['key'];
        // obj[key];
        // 第一次 : obj['name']
        // 第二次 : obj['age']
        // 第三次 : obj['height'];
        console.log("键名是"+key +"键值是:"+obj[key]);
    }      //对象无length方法

判断对象是否为空对象

        var obj = {
            name:"张三",
            age:20,
            height:"178cm"
        }
        let length = 0;
        for(var key in obj){
            length++;
        }
        if(length>0){
            console.log("不是空对象")
        }else{
            console.log("是空对象");
        }

包装对象 *********

        // 包装对象 : 简单的数据类型 在调用固有方法的时候会包装成一个对象
        // 简单数据类型 : 数字 、字符串 、布尔值、undefined 、null、bigInt 、symbol
        // 包装对象 : 数字 、字符串 、布尔值、bigInt 、symbol
        // 非包装对象 :undefined 、null 
        // var str = "a-b-c-d";
        // var arr = str.split("-");  // 为什么可以是 .语法 
        // console.log(arr);

        // js执行简单数据类型方法的时候 首先js 会把简单数据类型变成一个对象 ,这个对象就是包装对象 。可以调用 对象下的各种方法,调用完成之后 系统会自动销毁这个包装对象;

数组

  • 数组 : 键值的集合 ;键名 索引 自动生成的;

一、数组的创建

1、字面量创建

        //键名会自动生成,且重0 开始;
        var arr = ["张三","李四",20,null,true,function(){},undefined,{name:"123"},[1,2,3]];
        console.log(arr);

2、内置构造函数

        //1. 只给一个数字参数 
        var arr = new Array(6);  // 创建一个长度为 6的空数组;
        console.log(arr);
        //2.给多个参数 
        var arr = new Array(6,7,8,9);  // 把传入的参数作为数组的键值;
        console.log(arr);

二、数组的循环

1、for循环

        var arr = ["张三","李四","王五"];
        for(var i=0;i<arr.length;i++){
            console.log(i,arr[i]);
        }

2、for in循环

        var arr = ["张三","李四","王五"];
        for(var key in arr){
            console.log(key,arr[key]);
        }

三、数组的添加操作

1、获取值

        var arr = ["张三","李四","王五"];
        //          0       1     2
        // console.log(arr[1]);
        // 2.设置键值 
        arr[1] = "修改了";
        console.log(arr);

2、unshift()在头部添加

        //会改变原本的数组;
        var arr = [1,2,3,4,5];
        arr.unshift("添加的内容");
        arr.unshift("添加的内容2");
        console.log(arr);

3、push() 在尾部添加

        // 会改变原本的数组;
        var arr = [1,2,3,4,5];
        arr.push("添加的内容1");
        arr.push("添加的内容2");
        console.log(arr);

4、在指定位置添加 splice(索引值,删除的个数,"添加的内容")

        var arr = [1,2,3,4,5];
        //         0 1 2 3 4
        arr.splice(1,0,"添加的内容");
        console.log(arr);

四、数组的删除操作

1、修改数组的长度 length

        //设置数组的长度 来删除元素 ;
        var arr = [1, 2, 3, 4, 5];
        arr.length = 3; 
        console.log(arr);

2、 shift() 删除头部的元素

        //是改变原本的数组 ,返还值是被删除的元素;
        var arr = [1, 2, 3, 4, 5];
        var res = arr.shift();
        console.log(res);

3、pop() 删除尾部的元素

        //改变原来的数组,返还值是删除的元素;
        var arr = [1, 2, 3, 4, 5];
        var res = arr.pop();
        console.log(arr);
        console.log(res);

4、splice() 删除指定位置元素

        // 会改变原本的数组,返还值是删除的内容(数组形式);
        var arr = [1,2,3,4,5];
        var res =  arr.splice(2,1);
        console.log(res);

        // 可以替换元素
        var arr = [1,2,3,4,5];
        arr.splice(1,1,"添加的内容");
        console.log(arr);

5、slice() 截取数组元素

        // 数组.slice(开始截取的索引值,结束截取的索引值);
        // 包前不包后
        // 不会改变原本的数组,截取的内容是返还值;
        var arr = ["张三","李四","王五","王六"];
        //          0       1     2     3
        var res =  arr.slice(1,3);  
        // console.log(arr);
        console.log(res);

五、数组的其他方法

1、join("x")把数组变成字符串 通过"x"拼接

        var res = arr.join(""); //abcd
        var res = arr.join("-"); //a-b-c-d
        var res = arr.join(); // a,b,c,d 

2、concat() 合并多个数组

      var arr1 = [1, 2, 3, 4];
      var arr2 = [5, 6, 7];
      var arr3 = [8, 9];

      var arr4 = arr1.concat(arr2,arr3)

3、反转数组 reverse()

      var arr = ["a", "b", "c", "d"];
      arr.reverse(); 

4、indexOf() 判断某个键值在数组中的索引位置 返回索引值,若键值在数组中不存在 返回-1

      var arr = ["a", "b", "c", "d"];

      var res = arr.indexOf("d"); //3
      var res = arr.indexOf("e"); //-1

5、数组排序 sort()传入一个回调函数,不传参默认按ASCII码排序

      var arr = [4, 2, 1, 3, 6, 9, 5, 22];
      arr.sort(function (a, b) {
        return a - b;
      }); 
      // sort 可以排序对象数组;
     var arr = [
        { name: "张三", age: 20 },
        { name: "张三", age: 19 },
        { name: "张三", age: 21 },
      ];
      arr.sort(function (a, b) {
        return a.age - b.age;
      });
      console.log(arr); 
      
       // 数组的去重
      /* var arr = [1, 1, 2, 3, 4, 4, 5, 6, 6, 6];
      var arr1 = [];
      for (var i = 0; i < arr.length; i++) {
        if (arr1.indexOf(arr[i]) === -1) {
          arr1.push(arr[i]);
        }
      }
      console.log(arr1); */

      //对象键名不重复
      /* var arr = [1, 1, 2, 3, 4, 4, 5, 6, 6, 6];

      var obj = {};
      var arr1 = [];
      for (var i = 0; i < arr.length; i++) {
        obj[arr[i]] = "";
      }
      for (var key in obj) {
        arr1.push(+key);
      }
      console.log(arr1); */