美文网首页
2019-08-03对象

2019-08-03对象

作者: 啊_6424 | 来源:发表于2019-08-03 17:32 被阅读0次

    先回顾一下JS中的数据类型:

    • String
    • Boolean
    • Number
    • Null
    • Undefined
    • Object
      前五种是\color{red}{基本数据类型}\color{red}{Object是引用数据类型}
      在JS中,数据值只要不是基本数据类型,那么就可以认为是Object。
      所以,JS里的Object涵盖很广,包括了数组,函数function

    引入Object是为了弥补基本数据类型的不足,表现在以下:
    1.基本数据类型都是单一的值,值与值之间没有联系
    比如,我想表示一个人,这个人有很多信息,比如姓名,年龄,性别。
    用基本数据类型创建出来的数据都是独立的,不能形成一个整体。

        var name = "小明";
        var age = 16;
        var gender = "女";
    

    而用Object表示的话可以表示成一个整体
    对象属于一种复合数据类型,在对象中可以保存不同的数据类型的属性。

        var people = {
            name : "小明",
            age: 16,
            gender: "女"
        };
    

    对象的分类

    • 内建对象:
      由ES标准中定义的对象,在任何的ES的实现中都可以使用。
      比如:Math,String,Boolean,Number,Object,Function……
    • 宿主对象:
      由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
      比如:BOM(浏览器对象模型),DOM(文档对象模型)
    • 自定义对象:
      由开发人员自己创建的对象

    对象的基本操作

    基本操作包括对象的创建,添加属性,删除属性,转换为其他数据类型,对象的销毁等等。

    创建对象

         var people1 = new Object();
         var people2 = {};
    

    new运算符,会去调用对象的构造函数constructor,从而创建一个对象。

    对象的属性

    对象里面保存值的方式是属性名:属性值
    通过new关键字创建出来的对象是空对象,我们可以给对象添加或者删除属性来满足日常开发中的需求。

    • 访问属性
      语法1:对象.属性名
      语法2:对象["属性名"]
      使用中括号访问对象属性的方式更加灵活,我们可以在中括号里边传入一个变量,则会根据变量动态的查找对应的对象的属性。(变量可以是任何的基本数据类型,会转换为String类型)
    • 添加属性
      语法1:对象.属性名 = 属性值
      语法2:对象["属性名"] = 属性值
    • 修改属性
      语法1:对象.属性名 = 属性值
      语法2:对象["属性名"] = 属性值
    • 删除属性
      语法1:delete 对象.属性名
      语法2:delete 对象["属性名"]

    如果读取对象中没有的属性,返回Undefined;区别于读取未声明的变量,这会报错。

         var people1 = new Object();
         var people2 = {};
    
        people1.name = "小明";
        people1.age = 16;
        people1.gender = "女";
    
        people2.name = "小花"
        people2.age = 20;
        people2.gender = "女";
      
        people1.name = "晴晴";
        delete people2.gender;
    
        console.log(people1);
        console.log(people2);
    
       console.log("people1的性别", people1.gender);
       console.log("people2的性别", people1["gender"]);
    
    图片.png

    注意:.[]new运算符是优先级最高的

    属性名

    不强制要求符合标识符的规范,但尽量别这么去做。
    如果采用了特殊的属性名,访问属性则不能再通过.,需要通过另外一种方式。

    图片.png

    属性值

    JS对象的属性值可以是任何的数据类型,甚至可以是一个对象。

    我们可以使用 in 运算符检测对象中是否含有某个属性,有返回true,没有返回fasle。
    语法:属性名 in 对象

    引用数据类型

    通俗来说,引用数据类型就是按址访问,而基本数据类型是按值访问。

        var a , b;
        a = 3;
        b = a;
        var c , d;
        c =  {name:"小花", gender:"女"};
        d = c;
    
        a++;
        c.name = "小华";
        d.gender = "男";
    
        console.log(a,b);
        console.log("c", c);
        console.log("d", d);
    
    a与b不会互相影响,而c与d则会互相影响

    造成这样的原因与JS如何保存数据有关。
    JS里面有栈内存与堆内存之分:

    • 所有的变量都是保存在栈内存中的
    • 基本数据类型直接在栈内存中存储


      值与值之间独立存在
    • 引用数据类型保存到堆内存,每创建一个新的对象,就在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址


      图片.png

    来几个例子加深对引用数据类型的理解

    我们来看一种情况:下面代码中people1是否也会变成null,通过结果发现并没有变为null

        var people1 = {name: "Jan"};
        var people2 = people1;
        people2 = null;
        console.log("people1",people1);
        console.log("people2",people2);
    
    图片.png

    原因就是,我们只是改变了变量的值,让变量失去了对对象的引用,代码并没有改变对象的值。


    图片.png
        var obj3 = new Object();
        var obj4 = new Object();
        obj3.name = "孙悟空";
        obj4.name = "孙悟空";
        console.log(obj3 == obj4);
        console.log(obj3.name == obj4.name)
        var obj5 = obj3;
        obj5.name = "沙和尚"
        console.log(obj5 == obj3);
        console.log(obj5,obj3);
    
    结果 obj3和obj4不相等的原因:new运算符会开辟一个新的内存空间,将新的内存地址赋给变量,故而变量obj3与obj4不相等

    obj3和obj4不相等的原因:new运算符会开辟一个新的内存空间,将新的内存地址赋给变量obj4,故而变量obj3与obj4不相等
    obj3和obj5相等的原因:我们通过赋值运算符(=)将obj3的值(即是对应对象的地址)赋值给了obj5,故相等。
    注意,变量之间的比较不是按址比较,就是按值比较,只不过,对于obj3,obj4,obj5而言,他们的值代表了地址而已。
    obj3的name属性与obj4的name属性是相等的,因为按值比较,他们的值就是相等的。

    对象字面量

    我们上面介绍了创建对象可以有两种方式,一种是通过new运算符,一种是通过{}
    \color{red}{ 大括号就是对象字面量。 }
    通过对象字面量创建对象时可以直接设置对象的属性。
    对象字面量里面的属性名可以加引号,也可以不加引号;推荐不加。但是如果属性名比较特殊,则一定要加上引号。

    相关文章

      网友评论

          本文标题:2019-08-03对象

          本文链接:https://www.haomeiwen.com/subject/qttsdctx.html