the documentation says that it is 5V tolerant, you could connect it to 5V without resistors, too.
Well, the Amazon description says "3V-5V power supply Universal", which is a little loosey-goosey... 
That module (the PCB and all its components) has a voltage regulator than can take 5V and provide the specified 3.3V to the Neo-6M GPS chip: you can safely connect a 5V power supply to the module's Vcc pin.
However, the Neo-6M GPS chip uses 3.3V, so the GPS TX pin output voltage is about ~2.9V. This is slightly under the Arduino RX pin input voltage for a logic 1 (3.0V). A direct connection works for many people, but it could cause problems with the Arduino receiving the chars correctly.
And when connecting the Arduino TX pin to the GPS RX pin (for sending configuration commands), a logic one from the Arduino (4.2V minimum) exceeds the GPS input level (3.6V maximum). This can cause the GPS chip to overheat or even fail, or decrease the battery life of a mobile system. At the very least you should use some sort of level shifting on the GPS RX pin (e.g. a series resistor to limit current).
I feel that people have been mixing and matching with no rhyme or reason. I assume the options really ought to be: 1) 5v w/ resistors, or 2) 3.3v w/o resistors.
Yes. According to the specs, you should perform level shifting for the GPS's data pins if they are connected to a 5V Arduino. As you have seen, lots of people get away with direct connections. I think I've seen 2 or 3 cases here (i.e., posted questions) where it looks like the module got fried by a direct connection. It usually works well enough, for most people.
Personally, I prefer level-shifting modules, because they're cheap, low-power, reliable and will also work for high-speed interfaces like an SD card reader. Here's a do-it-yourself schematic for those modules. Or, for this (relatively) low-speed serial interface, here's my previous reply that uses a few resistors and a diode.
And I'd also like to mention my library, NeoGPS. It's smaller, faster and more accurate than all other libraries, and it can be configured to only parse the fields and sentences that you really use. The examples are properly structured and ready for you to modify. Many users have trouble adding features to other libraries' examples.
The Arduino pin options for connecting to the GPS are in this order:
-
0 & 1 (aka Serial
) is absolute best, if you're not using it for debug messages or some other device.
-
8 & 9 with AltSoftSerial
is next best. It is very efficient and reliable. Strongly recommended!
-
Any two pins with NeoSWSerial, which is almost as efficient and reliable, but only supports 9600, 19200 and 38400. I maintain this library.
-
Absolute worst is using SoftwareSerial on any two pins. It is very inefficient, because it blocks interrupts for long periods of time. This can interfere with other parts of your sketch or other libraries.
Cheers,
/dev