Javascript:在未定义的赋值时默默地失败

时间:2017-03-29 03:45:19

标签: javascript

假设我试图以导致异常的方式分配变量

我将访问字典中不存在的密钥:

myObject.property = dictionary['NO_KEY'][0];

现在,因为' NO_KEY'在字典上不存在,我的程序在尝试下标0未定义时会捕获异常 - 并且崩溃。是否可以在上面执行此行作为no-op,以便我的脚本可以继续运行?我知道有try-catch syntex,但是ESMA6有更优雅的语法吗?

4 个答案:

答案 0 :(得分:1)

您可以使用if条件和声明,Object.hasOwnProperty()或@Ryan in运营商建议

if (dictionary.hasOwnProperty("NO_KEY")) {
  myObject.property = dictionary["NO_KEY"][0];
}

if ("NO_KEY" in dictionary) {
  myObject.property = dictionary["NO_KEY"][0];
}

答案 1 :(得分:1)

Object.defineProperty(Object.prototype, 
                      'accessWithSilentFail', { 
                       configurable: false,
                       enumerable: false, 
                       writable: false, 
                       value: function(key) {
                         return this[key] ? this[key] : {};
                       }});

myObject.property = dictionary
                     .accessWithSilentFail('NO_KEY')
                     .accessWithSilentFail(0);

如果在任何时候链失败,你会得到一个空对象。您需要获取一个对象,以便链条不会中途失败。如果要使用它,可以将函数调用得更短。

虽然这有效,但它有很多很多限制,它会改变Object原型,这通常是不受欢迎的。你真的应该考虑只检查undefined,这是惯用的方法。

如果您需要检查访问链是否失败,可以使用:

function chainFailed(result) {
    return Object.keys(result).length === 0;
}

所以你可以做到

myObject.property = dictionary
                      .accessWithSilentFail('NO_KEY')
                      .accessWithSilentFail(0);

if (!chainFailed(myObject.property)) {
  //keep on
} else {
  //handle failure
}

只要您的预期返回不是空对象,这就起作用,在这种情况下,chainFailed将始终返回true。但我假设你真的想要默默地失败,因为如果你想处理错误,你可以使用例外。

答案 2 :(得分:0)

使用三元运算符

myObject.property = dictionary['NO_KEY'] ? dictionary['NO_KEY'][0] : null;

答案 3 :(得分:0)

虽然我认为这是一个糟糕的主意,以后会再次咬你,但这是一个使用proxies的现代浏览器的解决方案。是的,您仍在检查属性是否存在,但是您的代码访问字典键是隐藏的。



var dictionary = {a: 42};

dictionary = new Proxy(dictionary, {
    get: (target, property) => {
        if (target.hasOwnProperty(property)) {
            return target[property];
        }
        return {};
    }
});

// Existing properties are passed through unchanged
console.log(dictionary.a);
// Missing properties result in an empty object
console.log(dictionary.b);
// Original test
var lost = dictionary['NO_KEY'][0];
console.log(lost);