Javascript JS:如何返回';未定义';而不是抛出错误';无法读取未定义的';

Javascript JS:如何返回';未定义';而不是抛出错误';无法读取未定义的';,javascript,Javascript,当父属性不存在时,让js返回undefined而不是抛出错误的最佳方法是什么 范例 a = {} b = a.x.y.z // Error: Cannot read property 'value' of undefined // Target result: b = undefined 我会说得有点冗长: var b = ((a.x || {}).y || {}).z 您必须检查每个属性是否存在: var b; if (a.x && a.x.y && a.x

当父属性不存在时,让js返回undefined而不是抛出错误的最佳方法是什么

范例

a = {}
b = a.x.y.z
// Error: Cannot read property 'value' of undefined
// Target result: b = undefined

我会说得有点冗长:

var b = ((a.x || {}).y || {}).z

您必须检查每个属性是否存在:

var b;
if (a.x && a.x.y && a.x.y.z) {
    b = a.x.y.z
}
或者,模仿其他海报的“安全获取”功能:

var get = function (obj, ns) {
    var y = ns.split('.');
    for(var i = 0; i < y.length; i += 1) {
        if (obj[y[i]]) {
            obj = obj[y[i]];
        } else {
            return;
        }
    }
    return obj;
};

您可以编写一个
safeGet
helper函数,类似于:

根据arcyqwerty评论中的建议进行了向下展开编辑

var getter = function (collection, key) {
    if (collection.hasOwnProperty(key)) {
        return collection[key];
    } else {
        return undefined;
    }
};

var drillDown = function (keys, currentIndex, collection) {
    var max = keys.length - 1;
    var key = keys[currentIndex];

    if (typeof collection === 'undefined') {
        return undefined;   
    }

    if (currentIndex === max) {
        return getter(collection, key);
    } else {
        return drillDown(keys, currentIndex + 1,
                         getter(collection, key));
    }
};

var safeGet = function (collection, key) {
    if (key.indexOf(".") !== -1) {
        return drillDown(key.split("."), 0, collection);
    } else {
        return getter(collection, key);
    }
};

a = { x: 1 };
b = safeGet(a, 'x.y.z');

@arcyqwerty我想如果(例如TypeError)是的,你可以做
。假设它工作得很好。添加
throw e
(如果为false)如果不想用大量
填充代码,请尝试
/
catch
(这是一种解决方案),在JS中,通常在使用对象的特定属性/方法之前检查对象是否已定义。这意味着,在这种情况下,您应该在访问
a
之前验证
x
,以此类推。如果您使用这种方法来模拟名称空间,您可以创建自己的函数,为您递归地执行此操作。我通常会这样做,但有大量属性(我无法控制,它从其他地方获取数据结构),并且需要一种更短/更干净的方法来执行此操作。您认为我的其他建议如何;这是一种黑客行为,但您可以将其称为:
get(someVar,'x.y.0.z')
。这仍然会爆炸,您需要使用
typeof
操作符。@jbabey您能提供一个“爆炸”的示例吗?需要对许多嵌套键进行操作,多次调用safeget可能会有点麻烦long@arcyqwerty这可以通过将密钥解析为由
分隔的部分并递归调用safeGet来轻松解决
var b = get(a, 'x.y.z');
var getter = function (collection, key) {
    if (collection.hasOwnProperty(key)) {
        return collection[key];
    } else {
        return undefined;
    }
};

var drillDown = function (keys, currentIndex, collection) {
    var max = keys.length - 1;
    var key = keys[currentIndex];

    if (typeof collection === 'undefined') {
        return undefined;   
    }

    if (currentIndex === max) {
        return getter(collection, key);
    } else {
        return drillDown(keys, currentIndex + 1,
                         getter(collection, key));
    }
};

var safeGet = function (collection, key) {
    if (key.indexOf(".") !== -1) {
        return drillDown(key.split("."), 0, collection);
    } else {
        return getter(collection, key);
    }
};

a = { x: 1 };
b = safeGet(a, 'x.y.z');