Which form is right for your specific issue?
A "permanent redirect" is used when the redirecting URL is no longer valid. It signals that the redirection target URL should replace the old one - and that a search engine should transfer all "value" (value through links, age, etc) to the new URL. The search engine should remove the old URL when finding a 301 redirect. In practice, this does not happen instantly, however.
A single-page 301 redirect can be used to signal that a page has moved to a new URL or it can just be used to signal that a page no longer exists (ie a 301-redirect to the root page in the website). Also see: "how to do single page 301 redirects".
A site-wide 301 redirect is often used to clean up canonical handling of a domain name. Many hosters set up http://www.domain.com and http://domain.com to serve the same content. This is technically incorrect. A site-wide 301-redirect can be used in this case to transfer any accesses to one domain to the other (preferred) domain. Also see: "how to do site-wide 301 redirects".
To see what a 301-redirect looks like, try the sample 301 redirect with the server header tool.
A "temporary redirect" is used when the redirecting URL is to remain valid, but the content is just "tempoaraly" available at the redirection target URL. To a search engine, this signals that the original URL is to remain in the index, but the content should just be extracted from the other URL. The URL of the redirection target should not be indexed.
There is a potential for "hijacking" with a 302-redirect. since the redirection target is not indexed, it is possible to move the indexed content to the redirecting URL. If this is done across domains (eg www.badsite.com 302-redirects to www.goodsite.com) then the content of the target page could be dropped and indexed under the redirecting URL (in this case: www.goodsite.com is removed, all of it's content is listed under www.badsite.com). Because of this, many search engines (Yahoo! first) have gone over to treating 302-redirects like 301-redirects when they go across domains. A cross-domain 302-redirect should never be used because of the ambiguous handling!
There is only one technically correct place for a 302-redirect: when you redirect from a generic entry page to a detailed URL with user-specific parameters, eg www.domain.com -> www.domain.com/userdata?user=blabla. You can often see this happening with many web-shops (eg Amazon). In this case, we want the original URL indexed - however, with the content of the specific URL.
To see what a 302-redirect looks like, try the sample 302 redirect with the server header tool.
A simple javascript redirect only takes the user to a new URL. Search engines cannot understand a javascript redirect - and since there are so many forms of it, this will likely remain so in the future. If you need the search engine to understand the redirect, you should not use a javascript redirect.
Technically, this is not so much a redirect as rather an information to the browser to refresh the page (reload it) after a certain time, possibly with a new URL instead of the current one. A meta-refresh redirect is placed in the "head" section of a page. It looks something like this:
<html> <head> .... <meta http-equiv="refresh" content="0;url=http://www.newdomain.com/folder/page.htm"> </head> <body> .... </body></html>
Meta refresh redirects are recognized by the major search engines. Depending on the time used (in this example "0" seconds means more or less instantly) the search engines assume a different form of redirect. Redirect times of zero ("0") or one ("1") second are considered 301 permanent redirects by most search engines. Two seconds or more will be considered as a 302 temporary redirect. A Meta-refresh redirect is not a substitute for a proper 301 redirect - but if your hoster gives you no other way, it is better than nothing.