写给前端小白的入门技术白皮书02-对象的常用方法

62 阅读3分钟

属性的获取

可以使用.或者[] 获取属性

const obj = {
    name: 'lily',
    age: 18,
}

obj.name; // lily
obj['age']; // 18   注意[]里可以是字符换也可以变量
const aaa = 'age';
obj[aaa]; // -> obj['age']  18  变量aaa
//还可以增加属性
obj.hobby = 'sing'

解构赋值

const obj = { name: 'lily', age: 18 };

// 获取对象的值可以通过解构的方式
const {name, age} = obj;
console.log(name); // 'lily'
console.log(age); // 18

// 也可以添加默认值
const {name, age, hobby = 'sing'} = obj;
console.log(hobby); // sing  如果对象中不存在hobby属性或者hobby为空,则使用'sing'默认值,若是有值则会覆盖默认值

delete

属性的删除

const obj = {
    name: 'lily',
    age: 18,
}

delete obj.name;
obj; //  { age: 18 }

for..in

遍历对象

const obj = {
    name: 'lily',
    age: 18,
}

for(let item in obj) {
    console.log(`${item}:${obj[item]}`) // name:lily    age:18
}

Object.assign()

语法: Object.assign(target, ...sources)

将source对象中属性合并到target上,如果有相同的属性,source中的属性会覆盖target中的属性

let target  = {
    name: 'lily',
    age: 18,
}

let source = {
    name: 'sala',
    hobby: 'sing'
}

let source2 = {
    height: 180,
    weight: 200
}

Object.assign(target, source);
// 合并之后target为 {name: 'sala', age: 18, hobby: 'sing'}

Object.assign(target, source, source2);
// 合并之后target为 {name: 'sala', age: 18, hobby: 'sing', height: 180, weight: 200}

Object.assign() 还有其他用法,可自行百度深入了解

拓展运算符...

也可用来合并对象。此方法对于对象的第一层是深拷贝,若是多层也是浅拷贝了,具体见下面的深拷贝之Object.assign()类似

let name = {name: 'lily'};
let age = {age: 18};
let person = {...name, ...age};
// person: {name: 'lily', age: 18}

Object.keys()

返回一个由对象所有key值组成的数组

let obj  = { name: 'lily', age: 18};
let keys = Object.keys(obj);
// keys: ['name', 'age']
// 由此可以获取对象的长度
Object.keys(obj).length; // 2

// 还可以对keys进行循环 取出taeget的key值和对应的value值
Object.keys(obj).forEach(item => {
    console.log(`${item}:${obj[item]}`) // name: 'lily'   age: 18 
})

Object.values()

返回一个由对象所有value值组成的数组

let obj  = { name: 'lily', age: 18};
let values = Object.values(obj);
// values: ['lily', 18]

Object.entries()

返回一个由对象所有[key ,value]值组成的二维数组,

let obj  = { name: 'lily', age: 18};
let entries = Object.entries(obj);
// entries  [['name', 'lily'],['age', 18]]

对象的深拷贝与浅拷贝

  • 浅拷贝

    • 拷贝后的对象属性发生变化,原对象属性也会发生变化
let obj = { name: 'lily', age: 18};
let obj1 = obj; // obj1: { name: 'lily', age: 18};
obj1.name = 'kefan';
// 此时 obj.name 也会变成 'kefan'
  • 深拷贝

两个对象之间没有任何关系,修改obj1中的属性,obj不会改变其原有属性值

  1. 通过json实现,不能拷贝方法,会造成方法丢失
let obj = { name: 'lily', age: 18 };
let obj2 = JSON.parse(JSON.stringify(obj));
obj2.name = 'huahua';
obj.name; // 'lily'

// 如果对象中有方法属性

let obj = { 
    name: 'lily',
    age: 18,
    show: function() {
        console.log('aaa')
    }
};

let obj2 = JSON.parse(JSON.stringify(obj));
obj2; // { name: 'lily', age: 18 }  show方法丢失了
  1. 通过for-in遍历循环实现
let obj = { name: 'lily', age: 18 };
let obj2 = {};
for(let item in obj){
    obj2[item] = obj[item]
}

obj2; // { name: 'lily', age: 18 };

obj2.name = 'huahua';

obj.name; // 'lily'


// 以上只是针对一层的拷贝,若是深层次的,需进行递归处理

function deepClone(obj) {
    //判断是数组还是对象, 是数组就创建一个空数组,否则创建一个空对象
    let objClone = Array.isArray(obj) ? [] : {};
    // 判断obj是不是object类型,并且不为空
    if(obj && typeof obj === "object"){
         // 对obj进行遍历
        for(let key in obj){
          // 判断obj中是否存在key属性
          if(obj.hasOwnProperty(key)){
             if(obj[key] && typeof obj[key] === "object"){ // 判断如果obj[key]存在,并且obj[key]是仍是对象类型的时候,进行递归处理
                objClone[key] = deepClone(obj[key]);
             } else {  //  否则就是浅复制
                objClone[key] = obj[key];
             }
          }
        }
    }
}

let obj = { 
    name: 'lily', 
    age: 18,
    obj: {
        hobby: 'sing'
    }
};

let obj2 = deepClone(obj);
  1. 使用Object.assign() 进行对象合并
let target = {};
let source = { name: 'lily', age: 18 };

//将source合并到target上
Object.assign(target, source);
console.log(target); // { name: 'lily', age: 18 };
source.age = 200;
console.log(target.age); // 18

// 但是Object.assign() 只是针对对象的第一层是深拷贝,如果是两层或两层以上就是浅拷贝了
let source2 = { 
    name: 'lily', 
    age: 18,
    obj: {
        hobby: 'sing'
    }
};

Object.assign(target, source2);
console.log(target); // { name: 'lily', age: 18, obj: {hobby: 'sing'} };
source2.obj.hobby = 'dance';
target.obj.hobby; // dance

深拷贝 浅拷贝还可以使用函数库lodash里的clonedeepClone