After some research, this answer is my question 100%
I just copy the paste from the above blog
How jQuery selects elements using Sizzle
Selection process
There are many optimizations in jQuery that make you work faster. In this section, I will cover some of the queries and try to trace the jQuery route.
$ ("# header)
When jQuery sees that the input string is just one word and searches for an identifier, then jQuery calls document.getElementById. Simple and straightforward. Sizzle is not called.
$ ('# header a) in a modern browser
If the browser supports querySelectorAll, then querySelectorAll will satisfy this request. Sizzle is not called.
$ ('. header a [href! = "hello"]) in a modern browser
In this case, jQuery will try to use querySelectorAll, but the result will be an exception (at least in firefox). The browser throws an exception because the querySelectorAll method does not support certain selection criteria. In this case, when the browser throws an exception, jQuery will pass the Sizzle request. Sizzle not only supports the css 3 selector, but also higher and higher.
$ ('. header a) in IE6 / 7
In IE6 / 7, querySelectorAll is not available, so jQuery will pass this request to Sizzle. Let's see a little detail on how Sizzle will handle this case.
Sizzle gets the '.header a. It breaks the string into two parts and stores it in variables called parts.
1 parts = ['.header', 'a'] The next step is the one that installs Sizzle separately from other selector engines. Instead of first looking for elements with a class title and then going down, Sizzle starts with the outermost selector line itself. According to this presentation by Paul Irish, YUI3 and NWMatcher also go from right to left.