对象

65 阅读2分钟

1 认识对象

认识对象

对象(object)是"键值对"的集合 表示属性和值的映射关系

image.png

对象的语法

k和v之间用冒号分隔 每组k:v之间用逗号分隔 最后一个k:v对后可以不书写逗号

image.png

属性是否加引号

如果对象的属性键名不符合JS表示符命名规范 则这个键名必须用引号包裹

image.png

如何访问

可以用"点语法"访问对象中指定键的值

image.png

属性的访问

如果属性名不符合JS表示符命名规范 则必须使用方括号的写法来访问

image.png

属性的访问

如果属性名以变量形式储存 则必须使用方括号形式

image.png

<script>
    var xiaomi = {
        name : "小米",
        age : 12,
        sex : "男",
        hobbies:["足球","编程"],
        "favorite-book":"舒克和贝塔"
    }
    console.log(xiaomi.name)
    console.log(xiaomi.age)
    console.log(xiaomi.sex)
    console.log(xiaomi.hobbies)

    console.log(xiaomi["favorite-book"])
</script>

属性的更改

直接使用赋值运算符重新对某属性赋值即可更改属性

image.png

属性的创建

如果对象本身没有某个属性值 则用点语法赋值时 这个属性会被创建出来

image.png

属性的删除

如果要深处某个对象的属性 需要使用delete操作符

image.png

<script>
      var obj = {
        a: 10,
        b: 20
    }
        // 对象属性的修改
    obj.b = 40
    obj.b++
    console.log(obj.b)

    // 对象属性的增加
    obj.c = 60
    console.log(obj)
    // 对象属性的删除
    delete obj.a
    console.log(obj)
</script>

2 对象的方法

对象的方法

如果某个属性值是函数 则它也被称为对象的方法

image.png

方法的调用

使用"点语法"可以调用对象的方法

xiaoming.sayHello()

方法和函数

方法也是函数 只不过方法是对象的"函数属性" 它需要用对象打点调用

在正式学习了什么是"方法"之后 就能深入理解之前我们学习的一些函数的书写形式 比如:

image.png

3 对象的遍历

对象的遍历

和遍历数组类似 对象也可以被遍历 遍历对象需要使用for...in...循环

使用for...in...循环可以遍历对象的每个键

for...in...循环

image.png

<script>
    var obj = {
        a : 11,
        b : 22,
        c : 88
    }
    for (var k in obj) {
        console.log("对象obj的属性" + k + "的值是" + obj[k]) 
    }
</script>

4 对象的浅克隆

基本类型值和引用类型值

image.png

对象是引用类型值

对象是引用类型值 这意味着:

  • 不能用var obj2 = obj1这样的语法克隆一个对象
  • 使用==或者===进行对象的比较时 比较的是它们是否为内存中的同一个对象 而不是比较值是否相同
<script>
 // 例1
    var obj1 = {
        a : 1,
        b : 2,
        c : 3
    }
    var obj2 = {
        a : 1,
        b : 2,
        c : 3
    }
    console.log(obj1 == obj2)   // false
    console.log(obj1 === obj2)   // false

    console.log({} == {})   //false
    console.log({} === {})   //false
</script>
<script>
 // 例2
     var obj3 = {
        a : 10
     }
     var obj4 = obj3

     obj3.a++

     console.log(obj4)

</script>

对象的浅克隆

  • 复习什么是浅克隆: 只克隆对象的"表层" 如果对象的某些属性值又是引用类型值 则不进一步克隆它们 只是传递它们的引用
  • 使用for...in...循环即可实现对象的浅克隆
<script>
// 克隆咯
    var obj1 = {
        a : 1,
        b : 2,
        c : [44,55,66]
    }

    var obj2 = {}
    for(var k in obj1) {
        // 每遍历一个k属性 就给obj2也添加一个同盟的k属性
        // 值和obj1的k属性值相同
        obj2[k] = obj1[k]
    }

    obj1.c.push(77)
    console.log(obj2)
</script>

对象的深克隆