Regarding data holding:
Non static variable keeps it's value only for a one tick. So you can use it for various calculations per tick and you don't have to reset this variable as it gets reset by the engine at the end of current tick.
Global variable keeps it's value all the time. If you want to reset a global variable then you have to do it manually or use system action to reset all globals.
[EDIT]: Static variable keeps it's value all the time like globals. Difference is in the scope.
Constant keeps it's value all the time, but you cannot change it's value programmatically. You may think of it as of a helper feature.
If you need to use a callback in many places, or some Dictionary or Array index, then you would need to type it manually everywhere. Once your game evolves and you have to change indexes for instance, you would have to change it again in all those places. Now when you create a constant with the index value and use use it instead, you can change only constant's value (one line) and all the indexes will be changed.
Also Array.At(objectId, ATTACK_DAMAGE) is more human readable than Array.At(objectId, 0).
Constants help you maintain your code, give better readability and are strongly suggested to use for any data which will remain untouched the whole game. Also they do not affect performance in any way so don't worry about that. They are here to help you, it's wise to use them whenever it's possible.