String Comparison vs. Hashing
One possible hypothesis:

Javascript is interpreted, which can slow things down.

When you compare two strings, this will invoke a string comparison routine that is coded directly in assembly language or C, and thus string comparison will probably be about as fast as the architecture can possibly compare strings.  In contrast, when you hash strings, you have to execute multiple instructions in Javascript, which might incur overhead from an interpreter.

Another possible hypothesis:

Numbers in Javascript are a floating-point type.  There is no integer type in Javascript.  Your rolling hash probably involves what looks like integer arithmetic.  However, under the covers this is probably getting interpreted as operations on double-precision floats, which can be a bit slower.  This might also make your hash-based schemes slower.  Some Javascript engines might optimize this to integer arithmetic in certain circumstances, but no guarantees about whether any particular Javascript engine will or won't be able to do that in any particular case.