# Anatomy of a JavaScript program
A JavaScript program is essentially a list of instructions for the computer to follow to in order to achieve whatever useful thing the program is required to do.
## Statements
Each instruction in a program is called a **statement**
In JavaScript, statements are composed of **values**, **operators**, **expressions** and **keywords**, and end with a semicolon.
The following is a statement:
```js
const foo = 3 + 4;
```
In the above statement a *variable value* `foo` is created using the `const` *keyword*, and assigned a value using the *assignment operator*. This value is determined by *evaluating* the *expression* `3 + 4`, which combines the *literal values* `3` and `4` using the *addition operator*.
Most programs contain lots and lots of statements, which get executed consecutively, in the order they are written down.
### Values
There are actually two types of values in JavaScript, **literal** values, and **variable** values.
#### Literal values
A literal value is exactly what it sounds like - a value that is written down in it's literal, raw form.
In JavaScript this raw data comes in 5 main forms:
- **Numbers**
- **Strings** (aka text)
- **Booleans**
- **Arrays**
- **Objects**
Numbers, strings and booleans are known as **primitives**
Arrays and objects are known as **data structures**
Some examples of literal values:
```js
6;
'Hello';
true;
[1, 2, 3];
{ name: 'Fred', age: 79 };
```
#### Variable values
A variable is like a container used to store a literal value or a **function**. It provides a reference to a value, and can give a more semantic meaning to a value, so that code becomes both easier to read, easier to write and less repetitive.
JavaScript uses the *keywords* `var`, `const` and `let` to declare (create) variables, and the `=` *operator* to assign values to variables.
`var`, `const` and `let` are each slightly different. The primary difference is semantic rather than functional:
- `let` represents a variable that will be reassigned and change it's value;
- `const` represents a constant value that will not change.
- `var` pre-dates the introduction of `const` and `let`, and doesn't have any semantic connotations. It's use is still quite common, but is not recommended in modern JavaScript.
The following code declares a variable `foo`, and assigns it the literal value `'bar'` (a string).
```js
let foo;
foo = 'bar';
```
### Keywords
Keywords are basically reserved words that perform special actions and cannot be used as variable names.
For example, the keyword `const` creates a new variable.
Trying to create a variable called `let` is a not valid JavaScript syntax.
```js
const let = 10;
```
### Operators
Operators are special symbols that are used to combine two values and create a new one.
The main types of operator are:
- Arithmetic operators - used on numbers (e.g. `*` for multiplication)
- String operators - used on strings (e.g. `+` for concatination)
- Logical operators - used on booleans (e.g. `||`, the OR operator)
- Comparison operators - used assess a relationship between values (e.g. `===`, the equality operator)
- Assignment operators - used to set or alter the value of a variable (e.g. `+=`, the addition-assignemnt operator)
### Expressions
An expression is a combination of literal values, variables, and operators, which evaluates to a single value.
```js
1 + 2;
```
The above code is an expression that evaluates to `3`
## Blocks
JavaScript statements can be grouped together in **blocks** using curly braces (`{}`).
This is useful because it allows you to define statements that should be executed together.
Blocks are normally found in **functions**, **if-statements** and **loops**