This is an undocumented feature of Harlowe's engine. While I wouldn't expect it to change, you shouldn't rely on it. Also, that's not really what happens. The value isn't 0, it's undefined. Harlowe replaces undefined values with 0s when a command using an undefined value is run. This is fine for the most part, but uses processing power you don't need, and relies on the engine to pick up your slack and correct your errors. It also only works with numbers, so you need to initialize every other type of value anyway. Initializing your numbers too is just a good idea.
In general, Harlowe has a lot of features designed to massage errors into something runnable, but not having errors in your code in the first place is always the best way to approach it.