1.变量类型
- 值类型vs引用类型
- typeof运算符
- 深拷贝
2.变量计算
值类型
//值类型let a = 100let b = aa=200console.log(b) //100
引用类型
let a = {age:20}let b = ab.age =21console.log(a.age) //21
常见的值类型
let a //undefinedconst s = 'abc'const n = 100const b = trueconst s = Symbol('s')
常见的引用类型
const obj = {x:100}const arr = ['a','b','c']const n = null //特殊引用类型,指针指向为空地址//特殊引用类型,但不用于存储数据,所以没有“拷贝、复制函数”这一说funcion fn(){}
3.typeof运算符
- 识别所有的值类型
- 识别函数
- 判断是否是引用类型(不可再细分)
应用
识别所有的值类型
let a; typeof a //undefinedconst s = 'abc'; typeof str//stringconst n = 100 typeof n //numberconst b = true typeof b //booleanconst s = Symbol('s') typeof s //symboltypeof console.log //functiontypeof function(){} //function//能识别引用类型(不能再继续识别)typeof null //objecttypeof['a','b'] //objecttypeof {x:100} //object
浅拷贝
//浅拷贝 浅拷贝是指, 修改B对象的属性和方法会影响到A对象的属性和方法, 我们称之为浅拷贝const obj1 = {age:20,name:'xxx',address:{city:'beijing'},arr:['a','b','c']}const obj2 =obj1obj2.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 resultif(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 //110const b = 100+'10' //'10010'const c = true + '10' //'true10'
==运算符
100 == ‘100’ //true0 == '' //true0 == false //truefalse == '' //truenull == 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 = trueif(a){//......}const b= 100if(b){//.....}//falsely变量 不走if逻辑const c = ''if(c){//...}const d = nullif(d){//...}let eif(e){//...}
逻辑判断
console.log(10 && 0) //0console.log('' || 'abc') //'abc'console.log(!window.abc) //true
5.典型题
1.typeof能判断哪些类型
- 识别所有值类型
- 识别函数
- 判断是否是引用类型(不可再细分)
2.何时使用==,何时使用===
- 判断是否为null和undefined之外都用====
3.值类型和引用类型的区别
- 值类型赋值改变赋值的值时原值不变
- 引用类型赋值改变赋值的值时原值改变
4.深拷贝
- 注意判断值类型和引用类型
- 注意判断是数组还是对象
- 递归
