* Global variables.
Global variables make it harder to run independent subprograms in the same program. If the subprograms happen to have global variables that share the same names, then they will interfere with each other and likely fail, usually in difficult to diagnose ways.
* Newlines get converted into semicolons. JavaScript has a mechanism that tries to correct faulty programs by automatically inserting semicolons. It sometimes inserts semicolons in places where they are not welcome.
* Operator typeof is not very helpful. For example, "typeof null" is "object", "typeof [1,2,3]" is also "object".
* Operator + adds numbers and concatenates. The + operator can add or concatenate. Which one it does depends on the types of the parameters. If either operand is an empty string, it produces the other operand converted to a string. If both operands are numbers, it produces the sum. Otherwise, it converts both operands to strings and concatenates them. This complicated behavior is a common source of bugs. If you intend + to add, make sure that both operands are numbers.
* Operators == and != do type coercion. Use of the === and !== operators is always preferred.
* Too many falsy values. 0, Nan, '' (empty string), false, null, undefined are all false.
* for ... in operator mixes inherited functions with the desired data members (it does deep reflection).