Our first mutable data type.
Numbers, booleans, and strings are all immutable data types.
A given value never changes.
We can compute new values from existing values but the existing values stay what they are.
const x = 1 + 2
When we added 1 and 2 and got 3 neither the 1 nor the 2 changed to 3.
const s = 'foobar';
const s2 = s.substring(1).toUpperCase()
We computed the value 'OOBAR'
and assigned it to
s2
.
But the value of s
is still 'foobar'
.
let s = 'foobar';
let s2 = s;
Clearly s
and s2
have the same value.
Now we do this.
s = s.substring(1);
What do you think the values of s
and
s2
are now?
s
has changed.
s2
has not changed.
This is why it’s so important to understand the difference between values and variables.
Values exist somewhere in the computer.
Variables are names that refer to those values.
Changing what a name refers to doesn’t have any effect on the value it used to refer to.
Arrays represent a collection of values.
Each element of the collection can be independently changed.
[1, 2, 3, 'foo', true]
An array with five elements.
Values are enclosed in []
s and separated by commas.
[]
Same as with strings: []
.
const xs = [1, 2, 3, true, 'foo'];
xs[0] ⟹ 1
xs[1] ⟹ 2
xs[2] ⟹ 3
xs[3] ⟹ true
xs[4] ⟹ 'foo'
That we use []
s both in the syntax for making an array
and in the index operator, is either unfortunate or mnemonic,
depending on your point of view.
Assign to the first element of xs
.
xs[0] = 'x'
After the assignment:
xs[0]
⟹ 'x'
xs
⟹ ['x', 2, 3, true, 'foo']
I.e. the last element of the array
xs.push('another value')
xs ⟹ ['x', 2, 3, true, 'foo', 'another value']
push
is a method on arrays but unlike
substring
, toLowerCase
, and
toUpperCase
it modifies the value it is called on.
It also returns a value, namely the new length of the array.
xs.pop() ⟹ 'another value'
xs ⟹ ['x', 2, 3, true, 'foo']
pop
is another method on arrays. Like
push
, it modifies the value it is called on and also
returns a value, namely value being removed from the end of the
array.
Make an array and assign it to a variable.
const array1 = ['foo'];
Assign the same value to a new variable.
const array2 = array1;
Now mutate the array.
array1.push('bar');
array1
has changed, as we would expect.
array2
has also changed because it's just
another name for the same array.
array2.push('baz');
Sames as before: becaues array1
and
array2
are just different names for the same array,
changes made via one name are visible via the other.
const ticTacToe = [
[ 'X', 'O', 'O' ],
[ 'O', 'X', '' ],
[ 'X', '', 'O' ],
];
You don’t need to know any of these except the ones I’ve taught you about but you may find some of them useful as you start writing more complicated programs.