变量类型和计算

Boolean值(true、false)

  • false,undefined,null,0,NaN和一个空字符串 ''

typeof

  • 识别所有值类型
  • 识别函数
  • 判断是否引用类型
//能判断函数
typeof console.log //'function'
typeof function(){}//'function'

//能识别引用类型(object)
typeof null //'object'
typeof ['a','b'] //'object'
typeof { x:100 } //'object'

类型转换

字符串拼接

const a = 100 + 10    //110
const b = 100 + '10' //'10010'
const c = true + '10' //'true10'

parseInt()强制类型转换

=====

==:类型转换

//除了 == null 之外,其他一律用 ===
100 == '100' //true
0 == '' //true
0 ==false //true
false == '' //true
null == undefined //true

if语句和逻辑运算

  • truly变量:!!a === true的变量

js01-2.png

  • falsely变量:!!a ===false的变量

js01-1.png

//falsely变量,除此之外都是truly变量
!!0 === false
!!NaN === false
!!'' === false
!!null === false
!!undefined === false
!!false === false

值类型和引用类型的区别

//引用类型
let a = { age: 20 }
let b = a
b.age = 21
a.age //21

性能问题

  • 值类型在栈中实现

  • 引用类型

    js01-3.md.png

常见值类型(typeof)

let a //undefined     //'undefined'
const s = 'abc' //'string'
const n = 100 //'number'
const b = true //'boolean'
const s = Symbol('s') //'symbol'

常见引用类型

const obj = {x:100}
const arr = ['a','b','c']
const n = null //特殊引用类型,指针指向空地址

//特殊引用类型,但不用于存储数据,所以没有拷贝复制函数这种说法
function fn() {}

手写深拷贝

function deepClone(obj = {}) {
if(typeof obj !== "object" || obj == null){
//直接返回
return obj
}
// 初始化返回结果
let result
if(obj instanceof Array){
result = []
}else{
result = {}
}
// 遍历
for(let key in obj){
// 保证key不是原型的属性
if(obj.hasOwnProperty(key)){
// 递归
result[key] = deepClone(obj[key])
}
}
//返回结果
return result
}