This question could very easily merit it's own thread, but I'll try and keep it short.
In terms of what you get when you use $gameActors._data[1] and $gameActors.actor(1), they are exactly the same. The difference is in how they give you the value.
$gameActors._data[1] - will just try to spit out the actor, almost no questions asked.
$gameActors.actor(1) - will first check that the database has an actor 1 in it, then it will make sure that actor 1 has actually been created in the game (if it hasn't, it will create it), then it will give you the actor. If there is no actor in the database it will give you nothing (null).
Unless I have a very compelling reason to use $gameActors._data, I leave it be. $gameActors.actor can handle exceptions better, and is probably less likely to crash your game if you make a mistake. For example, say I want to change a property of actor 1, something like "$gameActors.actor(1)._hp = 5", if I forget to use the ._hp and instead use "$gameActors.actor(1) = 5" I'll get a message in the console telling me that this doesn't make sense and my game will continue. If I did this using "$gameActors._data[1] = 5", my game will crash immediately.
Regarding the difference between ".hp" and "._hp" etc. The versions without an underscore are getter properties, they run a function when you use them and return a value. If you look in the rpg_objects.js file and search "Object.defineProperties(Game_BattlerBase" you'll see a whole list of these properties. When defining properties like this there is the option to add a set function, however, this hasn't been utilised in the default MV code so using ".hp = 5" in effect does nothing.
When deciding which to use, it should be pretty clear that ".hp" isn't going to help you if you need to change an actors hp, but is a safe way of getting the value without any risk of accidentally changing it.
I would advise against just mashing straight in and using "._hp" etc. to set a value because there are functions that already exist for changing these things that have measures in place to make sure parameters don't exceed their maximums . Hp for instance has the function "gainHp", normal params have "addParam" and so on. That's not to say you should never use the "._hp" style properties, but I normally don't unless I have a reason for using them over an existing function.