07.对象

对象(object)

数据类型:

 原始值

  1. 数值 Number
  2. 大整数 BigInt
  3. 字符串 String
  4. 空值 Null
  5. 未定义 Undefined
  6. 符号 Symbol
  7. 布尔值 Boolean

 对象

  对象是JS中的一种复合数据类型,它相当于一个容器,在对象中可以储存不同类型数据

 原始值只能表示一些简单数据,不能表示复杂数据

 现在假设有这样一个需求,需要在JS中来表示一个人的信息。人的信息包含了三个内容(姓名、性别和年龄)。

let name = '汤姆'
let gender = '男'
let age = 15

创建对象容器

我们可以直接通过{}来创建对象。为了方便使用,还是需要将一个对象赋值给变量。

//创建一个对象,赋值给变量obj, 三种方法效果一样
 let obj1 = new Object(); 
 let obj2 = Object(); 
 let obj3 = {}; 

现在变量obj所指向的值就是一个对象,你可以通过console.log()打印一下看看对象到底长什么样子。

容器内添加属性

容器已经有了,下边可以向容器中添加值。对象中存储的值被称为属性,属性由两部分组成,属性名和属性值。向对象中添加属性:

对象.属性名 = 属性值

现在向对象obj中添加三个属性:

let obj3 = {}
obj3.name = "Tom"
obj3.aage = 13
obj3.gender = "male"
console.log(obj3)

添加属性后发现对象从{}变为了{name: "Tom", gender: "男", age: 15}

属性名

  • 通常属性名是一个字符串,所以属性名可以是任何值,没有特殊要求

   但是如果你的属性名实在是太特殊了,比如数字开头123¥¥@@?!不能直接使用,我们要用[" "]来设置

let obj3 = {}
   //不建议使用
   //  obj3.name = "Tom"
   //  obj3.if = 13
   //  obj3.let = "male"
   //  obj3["123$$##?!"] = "哈哈"
   //  console.log(obj3["123$$##?!"])

   

这些命名方法可以用但是不推荐使用

  •  也可以使用符号(symbol)作为属性名,来添加属性,获取这种属性时也必须使用symbol

   使用symbol添加的属性,通常是那些不希望被外界访问的属性

let obj3 = {}
        let mySymbol = Symbol()
        obj3[mySymbol] = "通过symbol添加的属性"
        console.log(obj3[mySymbol])

 

  • 使用[]去操作属性时,可以使用变量
 let obj = {}
        let str = "gender"
        obj[str] = "male" //等价于 obj["gender"] = "male"
        console.log(obj)
        console.log(obj.gender)

属性值

对象的属性值可以是任何数据类型,也可以是对象(嵌套)

let obj = {}
        obj.a = 123
        obj.b = "我要吃肉"
        obj.c = NaN
        obj.d = true
        obj.e = undefined
        // 往对象里添加对象
        obj.f = {}
        obj.f.name = "张三"
        console.log(obj)

读取容器内数据

值存进去了,要如何取出来呢?简单:对象.属性

如果读取的是一个对象容器中没有的属性,不会报错而是返回undefined

console.log(o.name) // Tom
console.log(o.gender) // 男
console.log(o.age) // 15
//reading an inexistent property    
console.log(o.inexistence) //undefined

对象中的属性主要分成了两个部分,像o.name、o.gender、o.age中的name、gender、age这些属于属性名,属性名的要求和标识符的是一致,还有一些特殊的情况,我们暂时先不讨论。属性值可以是任意值,啥都行!啥都行!只要是值就可以作为对象的属性值!

修改容器内数据

直接在原有属性上重新赋值即可

o.name = "Cat" 

删除容器内数据

delete o.name

检查容器内是否有某个属性

检查obj对象里是否有name这个属性,有返回true否则false

console.log("name" in obj)

对象字面量

上边这种用法,属于先创建对象然后再添加属性。除此之外也可以在创建对象时,直接向对象中添加属性:

{属性名:属性值,属性名:属性值,属性名:属性值}

上边的对象o也可以使用这种方式创建:

let obj = {
    name:'Tom',
    age:15,
    gender:'男'
}

这两种写法作用都是一样的没有任何区别,这种创建对象的方式叫做对象字面量,字面量的语法和CSS中声明块非常像,只是属性间不使用 ; 而是 , 隔开。另外需要注意,如果是最后的属性(上例中的 gender 属性),后边不能在写 , 了。

对象有了,也许你可以尝试自己创建一个对象,来存储一下你的个人信息。

枚举 for-in语句

枚举属性,指将对象中的所有属性全部获取
 
for-in语句
  语法:
    for(let xxx in 对象名){
      语句 . . .
    }
    for-in的循环体会执行多次,有几个属性就会执行几次,并不是所有属性都可以枚举比如symbol添加的属性。     
      每次执行时,都会将一个属性名赋值给我们所定义的变量
 
 let obj = {
            name: 'Tom',
            age: 15,
            gender: '男',
            [Symbol()]: "symbol属性" //不会被枚举
        }
        for (let aaa in obj) {
            //注意每次遍历aaa只被赋予属性名,只能通过obj[aaa]形式获取属性值
            console.log(aaa, obj[aaa])
        }
 
 

补充内容

方法(method)
  • 当一个对象的属性指向一个函数时
    • 那么我们就称这个函数为该对象的方法
    • 调用函数就称调用这个对象的方法
<script>
        // 创建obj对象
        let obj = {
            name: "孙悟空",
            age: 18,
            // sayHello函数
            sayHello: function () { console.log("hello!"); }
        }
        // 调用obj对象的sayHello()方法
        obj.sayHello() //hello!
</script>
 // 调用console对象的log()方法
        console.log();
 
其实都是函数,只不过为了区分改变了叫法而已。
对象内的函数叫方法
对象外的叫函数
 
 
 
 
 
posted @ 2022-10-11 20:11  莫扎特03  阅读(117)  评论(0编辑  收藏  举报