One quite important difference, not mentioned in the discussion so far, is:
\newcommand\foo{...} corresponds to \long\def\foo{...}
\newcommand*\foo{...} corresponds to \def\foo{...}
What does \long mean? Well, if \myCommand is defined using \long, then its arguments can contain paragraph breaks, like this:
\myCommand{Lorem ipsum
dolor sit
amet.}
If \myCommand were defined without \long, then the code above would generate an error. The idea is, that if you know that your command won't ever need to take arguments containing paragraph breaks, then defining it without \long helps you to catch some situations where you've forgotten a closing brace.
For more in-depth discussion: What's the difference between \newcommand and \newcommand*?
Slight digression. Here is a little example that highlights this particular difference between \newcommand and \def.
The following code prints Not empty ...
\documentclass{article}
\begin{document}
\newcommand\foo{}
\ifx\foo\empty Empty\else Not empty\fi
\end{document}
... but if you swap \newcommand for \def, it would print Empty! This phenomenon has been explained in a comment by Qrrbrbirlbel. The \empty command is created using \def\empty{}. Then, the \foo command is created (via \newcommand) using \long\def\foo{}. The presence of the \long stops these definitions being equal, and thus makes the test in the conditional fail.
\newcommandcan't make anything starting\end.... This is because LaTeX uses these names for the end of environments, and wants to 'discourage' you from breaking things. – Joseph Wright Jul 30 '10 at 18:18