似乎以下用于检查对象成员是否存在的技术会产生错误,因为在检查之前尚未声明'bar'父对象,这意味着我必须在检查之前声明它或使用两个'typeof'表达式,其中任何一个都是多余的代码:
var foo = {},
newVal = (typeof foo.bar.myVal !== 'undefined' ? foo.bar.myVal : null );
Error: foo.bar is undefined
那么,如何检查未申报对象中的成员是否存在而不产生错误?
我喜欢javascript,但有时......
答案 0 :(得分:9)
只需使用以下代码即可完成:
var newVal = (foo && foo.bar && typeof foo.bar.myVal !== 'undefined') ? foo.bar.myVal : foo.bar.myVal
属性为null或未定义,它将被评估为false,因此上述代码将仅处理第一个'false'语句。
答案 1 :(得分:6)
var newVal = ('foo' in window && // could be typeof foo !== 'undefined' if you want all scopes
'bar' in foo &&
'myVal' in foo.bar) ? foo.bar.myVal : null;
为了公平对待javascript,它几乎就像自然语言一样。
答案 2 :(得分:3)
最简单的测试是:
if (foo && foo.bar) {
// play with foo.bar.myVal ...
}
答案 3 :(得分:1)
你可以把它包装成一个方法:
function checkGraph(obj, graphPath)
{
var parts = graphPath.split(".");
var root = obj;
for (var i = 0; i < parts.length; i++)
{
var part = parts[i];
if (root[part] && root.hasOwnProperty(part))
root = root[part];
else
return false;
}
return true;
}
您可以将其称为:
var foo = {},
newVal = checkGraph(foo, "bar.myVal") ? foo.bar.myVal : null;
答案 4 :(得分:1)
正如Matthew Abbott在他的回复中给出的那样,你可以编写一个方法让它以后使用它,如果你做了很多潜入子属性,其中整个对象或链中的某个地方可以为空。以下是我使用lodash的实现。
checkGraph(obj, graphPath) {
if (obj) {
let root = obj;
_.each(graphPath.split('.'), part => {
if (root[part]) {
root = root[part];
} else {
return false; // bad property
}
});
return true;
}
return false; // bad object
}
你可以这样调用这个方法:
if (this.checkGraph(object, 'property.subproperty') {
// do thing
}
答案 5 :(得分:0)
还有另一种方法,您可以使用 Babel 之类的 JS转译器:
if (foo?.bar) {
// play with foo.bar.myVal ...
}