vs. []
Contrary to [, [[ prevents word splitting of variable values. So, if VAR="var with spaces", you do not need to double quote $VAR in a test - eventhough using quotes remains a good habit. Also, [[ prevents pathname expansion, so literal strings with wildcards do not try to expand to filenames. Using [[, == and != interpret strings to the right as shell glob patterns to be matched against the value to the left, for instance: [[ "value" == val* ]].
(()) is for numbers [] strings
[[ ]] can be used for number comparison, but you should not
Foo=foo # a string
if [[ $Foo -lt 10 ]]
echo $Foo is less than 1
^^^ bad, your script might not do what you expect it to do