It is dynamically typed.
Unlike block-scoped languages the scope chain nests via objects and functions. Local vars declared inside a function will be accessible to the remainder of the function regardless of whether they were defined inside a loop or conditional statement. Nested objects and functions have access to local vars declared in ancestors via a native call object that is not exposed to JS.
It is a functional programming language featuring first class functions which can be passed around as data and applied to new contexts while maintaining links to their original environment execution context through closures. (i.e. a nested function with references to a parent function's local variables will hold on to those values when returned even after the parent function has completed execution)
Object literals (JSON, basically) are also available.