Go through the basic JavaScript skills before interview --- Variable types and computing

Questions:

a. What kind of variable types can be checked by typeof?

b. When should use == and when should use ===?

c. What's the difference between value type and reference type?

d. Implement the deep clone manually.

Skills:

1. Assignment of value type and reference type:

let a = 100;
let b = a;
a = 200;
console.log(b) //100
let a = {age:20}
let b =a;
b.age = 21;
console.log(a.age)

value-type variables won't effect each other after assignment, but reference-type ones will.

The changes for value-type a and b in memory stack:

step 1let a = 100:

Key Value
a 100

step 2 let b = 100:

Key Value
a 100
b 100

step 3 a=200:

Key Value
a 200
b 100

The changes for reference-type a and b in memory stack and heap:

step 1 let a = { age: 20}:

In stack:

Key Value
a address 1

In heap:

Address 1 {age: 20}
Key Value

step 2 let b = a:

In stack:

Key Value
a address 1
b address 1

In heap:

Address 1 {age: 20}
Key Value

step 3: b.age = 21:

In stack:

Key Value
a address 1
b address 1

In heap:

Address 1 {age: 21}
Key Value

The computer will put value-type variables in the stack directly but use memory address to point to the value of reference-type variables, as the performance consideration and copy efficiency.

2. What's value types and reference types

let a // undefined
const s = 'abs' //string
const n = 100 // number
const b = true // boolean
const sb = Symbol('s') // symbol
const obj = { x: 100 }
const arr = ['a', 'b', 'c']

const n = null // special reference type, pointer points to empty address

// special reference type, typeof fn === 'function'
function fn() {}

3. typeof operator

// 1. typeof can check all value types
let a;   				typeof a // 'uundefined'
const str = 'abc'  		typeof str // 'string'
const n = 100;     		typeof n // 'number'
const b = true;			typeof b // 'boolean'
const sb = Symbol('s')	typeof sb // 'symbol'
// 2. typeof can check function
typeof console.log // 'function'
typeof function () {} // 'function'
// 3. tyypeof can check reference type but can't get details
typeof null // 'object'
typeof ['a', 'b'] // 'object'
typeof { x: 100 } // 'object'

4. Deep clone

const obj = {
    age: 20,
    name: 'xxx',
    address: {
        city: 'Auckland'
    },
    arr: ['a', 'b', 'c']
}

function deepClone(obj = {}){
    if(typeof obj !== 'object' || obj == null) {
        // obj is null or not an object/array, return directly
        return obj
    }
    
    // init the returned result
    let result
    if(obj instanceof Array) {
        result = []
    }else {
        result = {}
    }
    
    for(let key in obj) {
        // insure key is not the prototype property
        if(obj.hasOwnProperty(key)) {
            // Recursive
            result[key] = deepClone(obj[key])
        }
    }
    
}

Note: don't use deep clone randomly, as for huge objects, the performance is poor. E.g. in React

5. Variables computing & type conversion

// 1. string concatenation
const a = 100 + 10 // 100
const b = 100 + '10' // '10010' you can use 100 + parseInt('10', 10)
const c = true + '10' // 'true10'
// 2. == operator, this will cause falsy and truthy conversion
100 == '100' // true
0 == '' // true
0 == false // true
false == '' // true
null == undefined // true
// 3. Please use === except (== null):

const obj = { x: 100 }
if (obj.a == null) {}
// above code can be written like this:
// if (obj.a === null || obj.a === undefined) {}