📖 Deeper dive reading: MDN Data types and structures
Variables are declared using either the let or const keyword. let allows you to change the value of the variable while const will cause an error if you attempt to change it.
let x = 1;
const y = 2;Originally JavaScript used the keyword var to define variables. This has been deprecated because it causes hard-to-detect errors in code related to the scope of the variable. You should avoid var and always declare your variables either with let or const.
JavaScript defines several primitive types.
| Type | Meaning |
|---|---|
Null |
The type of a variable that has not been assigned a value. |
Undefined |
The type of a variable that has not been defined. |
Boolean |
true or false. |
Number |
A 64-bit signed number. |
BigInt |
A number of arbitrary magnitude. |
String |
A textual sequence of characters. |
Symbol |
A unique value. |
Of these types Boolean, Number, and String are the types commonly thought of when creating variables. However, variables may refer to the Null or Undefined primitive. Because JavaScript does not enforce the declaration of a variable before you use it, it is entirely possible for a variable to have the type of Undefined.
In addition to the above primitives, JavaScript defines several object types. Some of the more commonly used objects include the following:
| Type | Use | Example |
|---|---|---|
Object |
A collection of properties represented by name-value pairs. Values can be of any type. | {a:3, b:'fish'} |
Function |
An object that has the ability to be called. | function a() {} |
Date |
Calendar dates and times. | new Date('1995-12-17') |
Array |
An ordered sequence of any type. | [3, 'fish'] |
Map |
A collection of key-value pairs that support efficient lookups. | new Map() |
JSON |
A lightweight data-interchange format used to share information across programs. | {"a":3, "b":"fish"} |
When dealing with a number variable, JavaScript supports standard mathematical operators like + (add), - (subtract), * (multiply), / (divide), and === (equality). For string variables, JavaScript supports + (concatenation) and === (equality).
JavaScript is a weakly typed language. That means that a variable always has a type, but the variable can change type when it is assigned a new value, or that types can be automatically converted based upon the context that they are used in. Sometimes the results of automatic conversions can be unexpected from programmers who are used to strongly typed languages. Consider the following examples.
2 + '3';
// OUTPUT: '23'
2 * '3';
// OUTPUT: 6
[2] + [3];
// OUTPUT: '23'
true + null;
// OUTPUT: 1
true + undefined;
// OUTPUT: NaNGetting unexpected results is especially common when dealing with the equality operator.
1 == '1';
// OUTPUT: true
null == undefined;
// OUTPUT: true
'' == false;
// OUTPUT: trueUnexpected results happen in JavaScript because it uses complex rules for defining equality that depend upon the conversion of a type to a boolean value. You will sometimes hear this referred to as falsy and truthy evaluations. To remove this confusion, JavaScript introduced the strict equality (===) and inequality (!==) operators. The strict operators skip the type conversion when computing equality. This results in the following.
1 === '1';
// OUTPUT: false
null === undefined;
// OUTPUT: false
'' === false;
// OUTPUT: falseBecause strict equality is considered more intuitive, it is almost always preferred and should be used in your code.
Here is a fun example of JavaScript's type conversion. Execute the following in the browser's debugger console.
('b' + 'a' + +'a' + 'a').toLowerCase();JavaScript supports many common programming language conditional constructs. This includes if, else, and if else. Here are some examples.
if (a === 1) {
//...
} else if (b === 2) {
//...
} else {
//...
}You can also use the ternary operator. This provides a compact if else representation.
a === 1 ? console.log(1) : console.log('not 1');You can use boolean operations in the expression to create complex predicates. Common boolean operators include && (and), || (or), and ! (not).
if (true && (!false || true)) {
//...
}JavaScript supports many common programming language looping constructs. This includes for, for in, for of, while, do while, and switch. Here are some examples.
Note the introduction of the common post increment operation (i++) for adding one to a number.
for (let i = 0; i < 2; i++) {
console.log(i);
}
// OUTPUT: 0 1let i = 0;
do {
console.log(i);
i++;
} while (i < 2);
// OUTPUT: 0 1let i = 0;
while (i < 2) {
console.log(i);
i++;
}
// OUTPUT: 0 1The for in statement iterates over an object's property names.
const obj = { a: 1, b: 'fish' };
for (const name in obj) {
console.log(name);
}
// OUTPUT: a
// OUTPUT: bFor arrays the object's name is the array index.
const arr = ['a', 'b'];
for (const name in arr) {
console.log(name);
}
// OUTPUT: 0
// OUTPUT: 1The for of statement iterates over an iterable's (Array, Map, Set, ...) property values.
const arr = ['a', 'b'];
for (const val of arr) {
console.log(val);
}
// OUTPUT: 'a'
// OUTPUT: 'b'All of the looping constructs demonstrated above allow for either a break or continue statement to abort or advance the loop.
let i = 0;
while (true) {
console.log(i);
if (i === 0) {
i++;
continue;
} else {
break;
}
}
// OUTPUT: 0 1