五、对象(js)

  1. 对象

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

对象中可以储存多个各种类型的数据,
对象中存储的数据,我们称为属性

向对象中添加属性:
对象.属性名 = 属性值

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

<script> 
// 创建对象
let obj = Object()   
// console.log(obj)      //返回{} 

//向对象中添加属性     
obj.name = "孙悟空"
obj.age = 18
obj.gender = "男"

//修改属性
obj.name = "Tom sun"

//删除属性
delete obj.name

console.log(obj)

// console.log(obj.name)   //undefined ,因为obj.name属性已删掉
</script>

  1. 对象的属性

属性名

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

  • 但是如果你的属性名太特殊了,不能直接使用,需要使用[]来设置

  • 也可以使用符号(symbol)作为属性名,来添加属性,获取这种属性时,也必须使用symbol (使用symbol添加的属性,通常是那些不希望被外界访问的属性)

  • 使用[]去操作时,可以使用变量

属性值

  • 对象的属性可以是任意的数据类型

  • 使用typeof检查一个对象时,会返回object

in 运算符
用来检查对象中是否含有某个属性
语法 属性名 in obj
如果有返回true,没有返回false

<script>  
//创建对象
let obj = Object()
//添加属性
// obj.name = "孙悟空"
// obj.if = "haha"  
// obj["122345#@1!#!1"] = "呵呵"    //不建议

// let mySymbol = Symbol()
// let newSymbol = Symbol()
// // 使用symbol作为属性名
// obj[mySymbol] = "通过symbol添加的属性"
// console.log(obj[mySymbol])
        
obj.age = 18
obj["gender"] = "男"

// console.log(obj.gender)
// console.log(obj["gender"])

let str = "address"

obj[str] = "花果山"    //等价于obj["adress"] = "花果山"

// console.log(obj)
// console.log(obj[str])   //返回 花果山
// console.log(obj["address"])    //和上面的代码一样的意思,返回 花果山

obj.str = "haha"    //使用.的形式添加属性时,不能使用变量      
                                         
// console.log(obj)    //返回 {age: 18, gender: "男", address: "花果山", str: "haha"}
  
obj.a = 123
obj.b = 'world'
obj.c = true 
obj.d = 123n
obj.f = Object() 
obj.f.gender = "女"   //
obj.f.age = 28   //
// console.log(obj)
console.log(obj.f.age)    //获取age ----------> 返回 28

//用typeof检查obj
console.log(typeof obj)        //返回 object

//in运算符 ---------> 检查obj里面有没有name --------> 有 返回true,没有则返回false
  console.log("name" in obj)       // 返回false 
  console.log("age" in obj)        //返回true
</script>

  1. 对象字面量

对象的字面量:

可以直接使用{}来创建对象

使用{}所创建的对象,可以直接向对象中添加属性

语法:
{
属性名:属性值,
[属性值]:属性值,
}

</script> 
let obj = Object()   //第一种创建对象的方式
        // let obj2 = {}  //第二种创建对象的方式

        let mySymbol = Symbol()
        let obj2 = {
            age:"800",
            address:"猴山",
            ["gender"]:"男",
            [mySymbol] : "特殊的属性",
            hello:{
                a:1,
                b:true
            }
        }  //第二种创建对象的方式,可以直接在对象中添加属性
        obj2.name = "孙三娘"

        console.log(obj)     //返回 {}
        console.log(obj2)   //返回  {}
        console.log(typeof obj2)
    </script>

  1. 枚举对象中的属性

枚举属性:指将对象中的所有的属性全部获取

for-in语句

//for-in语法:
 for(let propName in 对象){
     语句...
 }
for-in的循环体会执行多次,有几个属性就会执行几次,
每次执行时,都会将一个属性名赋值给我们所定义的变量

注意:并不是所有的属性都可以枚举,比如 使用符号添加的属性

let obj = {
     name:'孙三娘',
     age:18,
     gender:"女",
     adderss:"猴山",
     [Symbol()]:"测试的属性" , //没有输出 ------> 符号添加的属性是不能枚举
    }

for(let propName in obj){
// console.log(1)     //1打印了三次---------->因为对象有三个属性
// console.log(propName)    //返回 name age gender address
// console.log(propName,obj.propName)  // 返回undefined,想要输出变量就不能使用点
console.log(propName,obj[propName])
 }

  1. 可变类型

原始值都属于不可变类型,一旦创建就无法修改

在内存中不会创建重复的原始值

对象属于可变类型

对象创建完成后,可以任意的添加删除对象中的属性

注意:

  • 当对两个对象进行相等或全等比较时,比较的是对象的内存地址

  • 如果有两个变量同时指向一个对象, 通过一个变量修改对象时,对另外一个变量也会产生影响

<script> 
// let obj = {name:"孙三娘"}
        let obj = Object()
        obj.name="孙三娘"
        obj.age = 18

        let obj2 = Object()
        // let obj3 = Object()   
        let obj3 = obj2  


        // console.log(obj)
        // console.log(obj2)
        // console.log(obj3)
        console.log(obj2 === obj3)   //false ---> 比较obj2和obj3其实是比较两个对象的地址,虽然两个变量所对应的对象都是空对象,但是地址不一样,所以不可能相等
        // let obj3 = obj2 ---> console.log(obj2 === obj3) ----> true  

        let obj4 = obj 

        obj4.name = "孙四娘"  //obj和obj4里的name都会变成孙四娘 ----> 当修改一个对象时,所有指向该对象的变量都会受到影响

        console.log("obj",obj)
        console.log("obj4",obj4)

        console.log(obj === obj4)  // true

    </script>
  1. 改变变量和改对象

修改对象

修改对象时,如果有其他变量指向该对象

则所有指向该对象的变量都会受到影响

修改变量

修改变量时,只会影响当前的变量

在使用变量存储对象时,很容易因为改变变量指向的对象,提高代码的复杂度,所以通常情况下,声明存储对象的变量时也会使用const

注意:const只是禁止变量被重新赋值,对对象的修改没有任何影响

<script> 
const obj = {
            name:"孙三娘"
        }

const obj2 = obj

// obj2 = {}  //  ----> 使用const时会报错,使用let时不会报错,因为

// obj2 = {}    // -----> 修改变量---------给变量obj2赋值新对象
// obj2.name="孙四娘"    //  obj的name不变,因为已经给obj2赋值新对象了,所以不影响obj的name属性

obj2.name="孙四娘"    // -------> 修改对象

// obj2 = null   //--------> 修改变量 --------- obj2返回null,且不影响obj

// console.log(obj)
// console.log(obj2)

const obj3 ={
   name:"孙老四"
  }

obj3.name = "孙孙孙"
console.log(obj3)

</script>
7.方法

方法(method):当一个对象的属性指向一个函数,那么我们就称这个函数是该对象的方法,调用函数就称为调用对象的方法。

<script>  
let obj = {}

obj.name = "孙三娘"
obj.age = 35

obj.sayHello = function fn() {
alert("hello")
 }
 //    console.log(obj)

obj.sayHello()  //alert执行   对象的属性也可以是函数

document.wright() //调用document.wright的方法     ----->   方法:一定是对象.方法

string()  //函数

</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值