假设我试图以导致异常的方式分配变量
我将访问字典中不存在的密钥:
myObject.property = dictionary['NO_KEY'][0];
现在,因为' NO_KEY'在字典上不存在,我的程序在尝试下标0未定义时会捕获异常 - 并且崩溃。是否可以在上面执行此行作为no-op,以便我的脚本可以继续运行?我知道有try-catch syntex,但是ESMA6有更优雅的语法吗?
答案 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);