Ответ 1
Если вы ожидаете, что YAHOO.Foo.Bar
будет действительным объектом, но хотите сделать ваш код пуленепробиваемым на всякий случай, если это не так, тогда может быть самым чистым, просто попробуйте поймать его и пусть один обработчик ошибок поймает отсутствующий сегмент. Затем вы можете просто использовать одно условие if
вместо четырех, которое обнаружит, существует ли свойство терминала и обработчик catch, чтобы поймать вещи, если промежуточные объекты не существуют:
try {
if (YAHOO.Foo.Bar.xyz) {
// operate on YAHOO.Foo.Bar.xyz
} catch(e) {
// handle error here
}
или, в зависимости от того, как работает ваш код, это может быть просто:
try {
// operate on YAHOO.Foo.Bar.xyz
} catch(e) {
// do whatever you want to do when YAHOO.Foo.Bar.xyz doesn't exist
}
Я особенно использую их при работе с иностранными вводами, которые должны быть определенного формата, но недопустимый ввод - это возможность, которую я хочу поймать и обработать самостоятельно, а не просто позволить распространению исключения вверх.
В общем, некоторые разработчики javascript недоиспользуют try/catch. Я нахожу, что иногда я могу заменить 5-10, если утверждения проверяют ввод с помощью одного try/catch вокруг большего функционального блока и делают код намного проще и читабельнее в одно и то же время. Очевидно, что, когда это уместно, зависит от конкретного кода, но это определенно стоит рассмотреть.
FYI, если обычная операция заключается в том, чтобы не генерировать исключение с помощью try/catch, это может быть намного быстрее, чем куча операторов if.
Если вы не хотите использовать обработчик исключений, вы можете создать функцию для проверки любого произвольного пути для вас:
function checkPath(base, path) {
var current = base;
var components = path.split(".");
for (var i = 0; i < components.length; i++) {
if ((typeof current !== "object") || (!current.hasOwnProperty(components[i]))) {
return false;
}
current = current[components[i]];
}
return true;
}
Пример использования:
var a = {b: {c: {d: 5}}};
if (checkPath(a, "b.c.d")) {
// a.b.c.d exists and can be safely accessed
}