Chapter V -- 对象

119 阅读3分钟

new Object(构造器)

    let obj1 = new Object();
    //向空对象中添加键值对:
    //方法1:对象名.属性名(key) = value(值)
    obj1.name = '张三',
        obj1.age = 18,
        //方法2:对象名[属性名] = value
        obj1['gender'] = '男',
        obj1['hobby'] = '篮球'

字面量创建时直接添加 大概酱: let/var 对象名= {属性名:value(值).....}

    let obj2 = {
        productName: 'kunkun',
        productAge: 18,
        productGender: '男吧',
        productHobby: '篮球0D5D222E.png唱ȪSGPic跳FaceTrapuool.exe'
    }

在对象外边添加 value(值)

    // 1、对象名.属性名 = value(值) 2、对象名[属性名] = value(值)
    obj2.menli = 30;
    obj2['menliz'] = 40;

修改

    obj2.productAge = 20;
    obj2['productName'] = 'aikun';

删除

    delete obj2.menli
    delete obj2['menliz']

    /* 给年龄加70岁 
       先取值再修改*/
    obj2.productAge = obj2.productAge + 70

    console.log(obj2);

取值

    console.log(obj2.productAge + '岁');
    console.log(obj2.productName);
    

对象比较导图.jpg

对象的比较

1、对象存在堆空间,基本数据存在栈空间,基本数据类型的字面量存在常量池
2、每一个对象在推空间中都有一个地址,对象名=地址
3、字面量和对象比较
       == :比较值
       ====:比较值和数据类型
4、当对象和对象比较时只比较地址
   let num = 'abc';
    let str = 'abc';
    let num1 = new Object('abc');
    let str1 = new Object('abc');

    console.log(num == str); //只比较值 true
    console.log(num === str); //比较值和数据类型 true
    console.log(num == str1); // 比较值,不比较数据类型 true
    console.log(num === str1); // 对象 === 时比较的是对象的地址,而不是比较数据类型 false
    console.log(num1 === str1); // 每一个对象的地址都不一样 所以是 false

当 obj1对象 赋值给 obj2对象 时会把对象地址一并赋值给了obj2

    let obj1 = {
         name : 'abc'
    } 
    let obj2 = obj1
    console.log(obj2);
    console.log(obj1 === obj2); //true 

值传递和地址传递:

    值传递:
    发生在基本数据类型之间,接收方修改数据不影响传递方的数据

    地址传递:
    发生在对象之间,传递方传递的是地址,接收方和传递方指向的是同一个对象,接收
    方改变了传递方给的对象,那么传递方的对象也一并跟着改变
    
    let str = 'abc';
    console.log(str);
    let str1 = str;
    str1 = str1 + 'd';
    console.log(str1); //abc

    let obj = {
        name: '张三',
        age: '18'
    }
    console.log(obj);//{name: '李四', age: '18'}
    let obj1 = obj;

    obj1.name = '李四';
    console.log(obj1);//{name: '李四', age: '18'}、

对象的解构

//从对象中只取一两个值其它不取
        let str = {
            productName : '张三',
            productAge : '18',
            productHobby : '篮球'
        }
        console.log(str);
        //方法一:取出存到对象中
        var str1 = str.productHobby
        var str2 = str.productAge
        console.log(str1);
        console.log(str2);
        //方法二:解构 var/let {需要的key,key1,key2,.....} = 对象
        var {
            productAge : age, //想要自定义属性名 可以用 属性名: 新的属性名 来改变
            productHobby : hobby
        } = str;
        console.log(age); //可以直接使用属性名输出
        console.log(hobby);

练习:

 定义一个用户对象user:该用户有属性:ID、账号、密码、工作经历
 
    定义一个工作经历对象workExpe
        该对象有属性:ID、工作公司、职位
        将workExpe对象赋值给user对象的工作经历属性
        输出user对象的工作经历中的工作内容
    定义一个变量attr=gender,将attr的值作为属性名添加到user对象中

    定义一个空对象userCopy,遍历user对象,将所有遍历到的属性和值添加到空对象userCopy中

    分别写一个值传递和地址传递的例子
        
    let user = {
        ID : 123456,
        number : 654321,
        password : 9876543,
        experience : ''
    }
    console.log(user);
    let workExpe = {
        ID : 12345,
        company : '无限公司',
        position : '外交部部长'
    }
    console.log(workExpe);
    user.experience = workExpe //将workExpe对象赋值给user对象的工作经历属性
    console.log(user.experience);
    user.attr = 'gender';//定义一个变量attr=gender,将attr的值作为属性名添加到user对象中

    //定义一个空对象userCopy,遍历user对象,将所有遍历到的属性和值添加到空对象userCopy中
    let userCopy = {}
    for (const key in user) {
        userCopy[key] = user[key]
    }
    console.log(userCopy);

    //值传递
    let express = '快递';
    console.log(express);
    let courier = express;
    console.log(courier);
    //地址传递
    let express1 = {
        address : '阿里巴巴',
        courier1 : '鳄梨'
    }
    console.log(express1);
    let courier2 = express1;//把express1里的值赋值给courier2
    courier2.courier1 = '阿勒';//取出courier2里的 key (courier1),并且修改值
    console.log(courier2);