#foo wird dabei als *[id="foo"] interpretiert.
Faktenwissen? Vermutung?
Soll ich jetzt die Codestelle heraussuchen, oder was würdest du als Fakt gelten lassen?
Mich würde es auch interessieren, der Teil des Browsers der die Selektorn verarbeitet und Elemente auswählt muss in irgend einer Form die ID-, Attribut- und Klassenselektoren verarbeiten.
Ich glaube kaum, dass im Internet Explorer 6 #foo als [id='foo'] interpretiert wird oder .foo als [class~='foo'], weil der Browser ja gemeinhin bekannt gar keine Attribut-Selektoren unterstützt - und auch wenn der IE7 aufwärts bereits mit Attribut-Selektoren umgehen kann, ist es davon auszugehen, dass hier wohl noch genug Altlasten eingebaut sind und die die Attribut-Selektoren als "Eigenlösung" dazugebaut wurden.
Natürlich: wenn man einen neuen Browser schreibt, wird man das wohl so machen (möglicherweise, denn die Spezifität ist ja auch ein Thema), aber ich bin mir nicht so sicher, ob man deine Aussage als Faustregel stehen lassen kann.