A more standard approach when using doubles would be to use base 2^32. This is important if you want to implement a Schoenhage-Strassen FFT, which certainly makes use of the fact that the base is a power of 2.
Of course, it would be more efficient to use a power of two, but using a power of 10 makes converting back and forth between strings (in decimal) quite a bit faster. In my original use case that was a large factor, so it's what I went with.
[edit] Ah ha, printed arrays have position zero on the left. I thought it was on the right.
The reason for putting the least significant digit first is that carries accumulate towards the most significant digit in ordinary arithmetic. Thus many of the simplest operations want to work from least significant to most significant digit. A final carry out at the top might add an extra digit to the result. It would be really annoying to work with arrays that had most significant digit first. If you had an extra digit you'd have to shift the entire array one place to accommodate it!
It's rather clever.
Aka little endian. http://en.wikipedia.org/wiki/Endianness
Rather than digits[2] for -123's least significant digit, and digits[1] for, say, 43's least significant digit.
http://www.leemon.com/crypto/BigInt.js
It's about the best I've seen and embodies all the principles that are being explained by Matt.