correción al codigo de
for(x in obj){ txt += " "+x; }
pero puedes salir desorganizado
El codigo de T. Collins es correcto. x es el nombre de la propiedad así que eso simplemente concatena los nombres de las propiedades del objeto, no los valores de las propiedades. El problema es tal y como comentas, el orden no es seguro.
Si quieres comprobar que una variable este definida la comparas contra undefined:
if(obj.apellidos !== undefined) {
//obj.apellidos está definido.
}
Si por ejemplo, estuviera anidado (obj.apellidos.primero por ejemplo), tienes que hacer chequeos en orden o te arriesgas a un TypeError:
if(obj.apellidos !== undefined && obj.apellidos.primero !== undefined) {
//obj.apellidos y obj.apellidos.primero estan definidos.
}
Undefined tambien es un valor falsey, por lo que puedes escribir así:
if(obj.apellidos){
//obj.apellidos existe.
}
El único problema es que hay otros valores que tambien son falsey (0, '', false, null, NaN). Si esos valores no pueden ser apellidos, entonces no tienes ningún problema.