Finished Chapter 3.8 Immutable Primitive and Mutable Objectives

master
Jason Zhu 2021-01-09 18:54:39 +11:00
parent 3317642595
commit 38cf678ec3
1 changed files with 60 additions and 0 deletions

View File

@ -536,6 +536,66 @@ Since ES2020, `globalThis` is used to refer to the global obj.
## 3.8 Immutable Primitive Values and Mutable Object References
Summary: in JS, primitive values are immutable, object values are mutable
Primitives are immutable:
* Only new values can be created/returned
* Can be compared by value:
* Two string/array are equal iif they have same lenght, and char at index is the same.
```js
let s = "hello"; // Start with some lowercase text
s.toUpperCase(); // Returns "HELLO", but doesn't alter s
s // => "hello": the original string has not changed
```
Objects are mutable:
* Their values can change
* Not compared by value. Two distinct/independent obj are not equal even if they have the same properties and values.
* They are also called **reference types** to be distinguished from JS's primitive types.
* Two obj values are the same iff they **refer** to the same underlying object. e.g. `let b = a`
Mutable obj
```js
let o = { x: 1 }; // Start with an object
o.x = 2; // Mutate it by changing the value of a property
o.y = 3; // Mutate it again by adding a new property
let a = [1,2,3]; // Arrays are also mutable
a[0] = 0; // Change the value of an array element
a[3] = 4; // Add a new array element
```
Two distinct/independent obj
```js
let o = {x: 1}, p = {x: 1}; // Two objects with the same properties
o === p // => false: distinct objects are never equal
let a = [], b = []; // Two distinct, empty arrays
a === b // => false: distinct arrays are never equal
```
Obj are same if they refer the same obj:
```js
let a = []; // The variable a refers to an empty array.
let b = a; // Now b refers to the same array.
b[0] = 1; // Mutate the array referred to by variable b.
a[0] // => 1: the change is also visible through variable a.
a === b // => true: a and b refer to the same object, so they are equal.
```
How to compare 2 distinct objs:
* Compare their properties/elements one by one
```js
function equalArrays(a, b) {
if (a === b) return true; // Identical arrays are equal
if (a.length !== b.length) return false; // Different-size arrays not equal
for(let i = 0; i < a.length; i++) { // Loop through all elements
if (a[i] !== b[i]) return false; // If any differ, arrays not equal
}
return true; // Otherwise they are equal
}
```
## 3.9 Type Conversions
### 3.9.1 Conversions and Equality