1.变量类型
- 值类型vs引用类型
- typeof运算符
- 深拷贝
2.变量计算
值类型
//值类型
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) //21
常见的值类型
let a //undefined
const s = 'abc'
const n = 100
const b = true
const s = Symbol('s')
常见的引用类型
const obj = {x:100}
const arr = ['a','b','c']
const n = null //特殊引用类型,指针指向为空地址
//特殊引用类型,但不用于存储数据,所以没有“拷贝、复制函数”这一说
funcion fn(){}
3.typeof运算符
- 识别所有的值类型
- 识别函数
- 判断是否是引用类型(不可再细分)
应用
识别所有的值类型
let a; typeof a //undefined
const s = 'abc'; typeof str//string
const n = 100 typeof n //number
const b = true typeof b //boolean
const s = Symbol('s') typeof s //symbol
typeof console.log //function
typeof function(){} //function
//能识别引用类型(不能再继续识别)
typeof null //object
typeof['a','b'] //object
typeof {x:100} //object
浅拷贝
//浅拷贝 浅拷贝是指, 修改B对象的属性和方法会影响到A对象的属性和方法, 我们称之为浅拷贝
const obj1 = {
age:20,
name:'xxx',
address:{
city:'beijing'
},
arr:['a','b','c']
}
const obj2 =obj1
obj2.address.city = 'shanghai'
console.log(obj1.address.city) //shanghai
深拷贝
//深拷贝 深拷贝是指, 修改B对象的属性和方法不会影响到A对象的属性和方法, 我们称之为深拷贝
function deepClone(obj = {}){
if(typeof obj !== 'object' || obj ==null ){
return obj; //obj是null,或者不是对象或者数组
}
//初始化返回结果
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;
}
const obj2 = deepClone(obj1)
obj2.address.city = 'shanghai'
console.log(obj1.address.city) //beijing
4.变量计算-类型转换
场景
- 字符串拼接
- ==
- if语句和逻辑运算
应用
字符串拼接
//字符串拼接
const a = 100 +10 //110
const b = 100+'10' //'10010'
const c = true + '10' //'true10'
==运算符
100 == ‘100’ //true
0 == '' //true
0 == false //true
false == '' //true
null == undefined //true
//除了==null之外,其他一律用 ===,例如:
const obj = {x:100}
if(obj.a == null){}
//相当于 if(obj.a ===null || obj.a === undefined) {}
if语句和逻辑运算
truly变量:!!a === true的变量
falsely变量: !!a === false的变量
!!0 === false
!!NaN === false
!!'' === false
!!null == false
!!undefined == false
!!false === false
//truly变量 走if逻辑
const a = true
if(a){
//......
}
const b= 100
if(b){
//.....
}
//falsely变量 不走if逻辑
const c = ''
if(c){
//...
}
const d = null
if(d){
//...
}
let e
if(e){
//...
}
逻辑判断
console.log(10 && 0) //0
console.log('' || 'abc') //'abc'
console.log(!window.abc) //true
5.典型题
1.typeof能判断哪些类型
- 识别所有值类型
- 识别函数
- 判断是否是引用类型(不可再细分)
2.何时使用==,何时使用===
- 判断是否为null和undefined之外都用====
3.值类型和引用类型的区别
- 值类型赋值改变赋值的值时原值不变
- 引用类型赋值改变赋值的值时原值改变
4.深拷贝
- 注意判断值类型和引用类型
- 注意判断是数组还是对象
- 递归