1、typeof判断
1.1 typeof操作符可以准确判断一个变量是否为下面几个原始类型(基本类型、值类型 )
typeof 'ConardLi' // string
typeof 123 // number
typeof true // boolean
typeof Symbol() // symbol
typeof undefined // undefined:
1.2 还可以用它来判断函数类型:
typeof function(){} // function
1.3 typeof判断引用类型返回(object):
typeof [] // object
typeof {} // object
typeof new Date() // object
typeof /^\d*$/; // object
typeof null // 'object'
2、== 与 === 的使用场景
除了 == null 之外,其他都一律 ===,例如:
const obj = { x : 100 }
if (obj.a == null ) { }
//相当于:
//if (obj.a === null || obj.a === undefined) { }
3、值类型(基本数据类型)和引用数据类型的区别
3.1 基本数据类型:Number、String、Boolen 、 Symbol、 null 、 undefined
3.2 引用类型:对象,数组,函数
3.3 值类型和引用类型的区别:
- 值类型的值一旦确定就不可变
- 基本类型的比较就是值的比较,只有值相等时,两者才相等
- 基本类型的变量是存放在栈区的(栈区指内存里的栈内存)
4、手写深拷贝
let cache = [] //初始化
function deepClone(source) {
//先判断是否是Object类型
if (source instanceof Object) {
//判断source是否在缓存里
let cacheDist = findCache(source)
if (cacheDist) { //有缓存
return cacheDist
} else { //没缓存
let dist
if (source instanceof Array) {
dist = new Array()
} else if (source instanceof Function) {
dist = function () {
return source.apply(this, arguments)
}
} else if (source instanceof Date) {
dist = new Date(source)
} else if (source instanceof RegExp) {
dist = new RegExp(source.source, source.flags)
} else {
dist = new Object()
}
cache.push([source, dist])
//遍历每个属性克隆
for (let key in source) {
if (source.hasOwnProperty(key)) {
dist[key] = deepClone(source[key])
}
}
return dist
}
}
return source
}
//查找缓存
function findCache(source) {
for (let i = 0; i < cache.length; i++) {
if (cache[i][0] === source) {
return cache[i][1] //对比 source 返回 dist
}
}
return undefined
}
5、类型转换,truly、falsely变量
经过两次非运算为true的为truly变量,反之则为falsely,只有是truly变量才会走到if语句内