what is the different among $, $eval, evaluate, page.querySelector

I am confused about the functions, sometimes page.querySelector work, but sometimes it do not work, so I use evaluate, and there are $, $eval in your api, so I am really curiouse about the differents

sometimes page.querySelector work, but sometimes it do not work, so I use evaluate, and page.evaluate worked, why