我一次又一次地处理代码,例如考虑以下假设的例子:
if (node.data.creatures.humans.women.number === Infinity) {
// do-someting
}
现在,问题是如果节点未定义,则此条件将中断。同样,如果node.data未定义,node.data.creatures未定义等等,它将会中断。
所以我最终使用了以下类似的长期条件:
if (node && node.data && node.data.creatures && node.data.creatures.humans && node.data.creatures.women && node.data.creatures.humans.women.number === Infinity) {
// do-someting
}
现在,想象一下我必须在代码的许多其他部分使用该JSON对象的一部分。
代码突然开始看起来非常难看。有没有更好的方法来避免错误,例如"不能调用未定义的属性"由于我提到的第一个条件导致的错误,使代码看起来更好。
你如何处理这种情况?
答案 0 :(得分:0)
尝试访问undefined
上的属性是可获取 TypeError
,因此您可以使用try..catch
:
try {
if (node.data.creatures.humans.women.number === Infinity) {
// do something
}
} catch (e) {
// property doesn't exist
}
答案 1 :(得分:0)
您可以使用try
- catch
包裹潜在有害的部分:
try {
if (node.data.creatures.humans.women.number === Infinity) {
// do-someting
}
} catch () {
console.log(e);
}
另一种方式,也许更优雅一点是定义预期的对象结构,并使用例如jQuery.extend()将它与实际数据合并。
var nodeTemplate = {
data: {
creatures: {
humans: {...}
}
}
}
这将确保结构符合您的预期,并且不存在的字段具有一些默认值。
然后合并:
node = $.extend(nodeTemplate, node);
答案 2 :(得分:0)
这是我正在使用的,它可能不是" optimizest"方式,但是,这对我有用:
walkObject = function(obj, path) {
var i = 0,
part = void 0,
parts = path.split('.');
while (obj && (part = parts[i++])) {
obj = obj[part];
}
return obj;
};
该方法接受一个对象,以及包含要测试的属性的点符号的字符串:
// the object
var obj = { a: { b: {c: [1,2,3], d: "aa"} } };
// tests
console.log("a,b,c", walkObject(obj, 'a.b.c')); // [1,2,3]
console.log("a,b,e", walkObject(obj, 'a.b.e')); // undefined
console.log("z,b,e", walkObject(obj, 'z.b.e')); // undefined