- High level: It provides abstractions that allow you to ignore the details of the machine where it’s running.
- Dynamic: As opposed to static programming languages, a dynamic language executes at runtime many of the things that a static language does at compile time.
- Dynamically typed: A variable does not enforce a type.
- Weakly typed: As opposed to strong typing, weakly (or loosely) typed languages do not enforce the type of an object.
- Interpreted: It’s commonly known as an interpreted language, which means that it does not need a compilation stage before a program can run.
- Multi-paradigm: The language does not enforce any particular programming paradigm.
A descriptor is a set of attributes of a property, and it’s composed by a subset of the following:
- value: the value of the property
- writable: true the property can be changed
- get: a getter function for the property, called when the property is read
- set: a setter function for the property, called when the property is set to a value
- configurable: if false, the property cannot be removed nor any attribute can be changed, except its value
- enumerable: true if the property is enumerable.