对象未定义时的最佳实践

Best practice when object is undefined if - else

本文关键字:最佳 未定义 对象      更新时间:2023-09-26

我想知道如果我的代码接近是好的,我想:

  1. 检查对象是否存在
  2. 如果不存在,创建它并为它分配属性
  3. 如果已经存在,只需分配属性

我现在拥有的是下面的代码,但是我不喜欢把同一行写两次

function doSomething(_whatever){
    if(typeof someobject === "undefined"){
        someobject = { //dont exist
            profile : "some value",
            status : []
        }
        someobject.status.push(_whatever);
    }else{
        someobject.status.push(_whatever); //because already exist
    }
}

写这段代码的更好的方法是什么?还是用一种更好、更少重复的方式?

thanks in advance

------原函数

function addPerson(_person){
    var people = Iee.dashboard.analytics.data.people.data;      
    if(typeof people[_person.Id_Emp] === "undefined"){
        people[_person.Id_Emp] = {
            profile : _person,
            status : []
        }
        people[_person.Id_Emp].status.push({Id_Emp : _person.Id_Emp, status : _person.Estatus1, estatusby : _person.Centro_de_trabajo});
    }else{
        people[_person.Id_Emp].status.push({Id_Emp : _person.Id_Emp, status : _person.Estatus1, estatusby : _person.Centro_de_trabajo});
    }
    addBlackList(_person);
}

一种常见的方法是进行冗余检查:

someobject = someobject || {
    project:"some value",
    status:[]
};

简化代码

function addPerson(_person){
        var people = Iee.dashboard.analytics.data.people.data;      
        people[_person.Id_Emp] = people[_person.Id_Emp] || {
                profile : _person,
                status : []
            };
            people[_person.Id_Emp].status.push({Id_Emp : _person.Id_Emp, status : _person.Estatus1, estatusby : _person.Centro_de_trabajo});
        addBlackList(_person);
    }

在这种情况下,你希望它是一个对象或未定义的,而不是字符串,数字等,所以你可以检查它是否有一个真值。

function addPerson(_person) {
    var people = Iee.dashboard.analytics.data.people.data,
        person = people[_person.Id_Emp];
    if (!person) person = {
        profile: _person,
        status: []
    };
    person.status.push({
        Id_Emp: _person.Id_Emp, 
        status: _person.Estatus1, 
        estatusby: _person.Centro_de_trabajo
    });
    addBlackList(_person);
}

这应该比其他答案中提到的冗余检查执行得稍微好一些,因为它只会在(真)值不存在的情况下才会给变量赋值。

只是为了好玩,这里有一个超浓缩的版本:

function addPerson(_person) {
    var people = Iee.dashboard.analytics.data.people.data, id = _person.Id_Emp;
    (people[id] || { profile: _person, status: [] }).status.push({
        Id_Emp: id, status: _person.Estatus1, estatusby: _person.Centro_de_trabajo
    });
    addBlackList(_person);
}