I also agree: #t is costly on sequences as they need first to be fully enumerated (and some sequences created from an input stream cannot be enumerated several times, it would cost too much to retain the full sequence in a cache for allowing it to be enumerated again for the for loop).
For tables and strings however, #t is instantaneous and ipairs() not needed... except when tables are not sequences and have integer keys outside the consecutive range 1 to N, that ipairs() could still enumerate all (ipairs can simply do the same as pairs(), filtering just keys according to their type, assuming that pairs() return all integer keys in ascending order.