变量类型和计算
一、值类型和引用类型
基本数据类型是直接赋值的,数据类型有:‘字符串’,‘数值’,‘布尔’,‘symbol’,‘undefined’
引用数据类型赋值的是堆中的内存地址,数据类型有:‘对象’,‘字符串’,‘null’,‘函数’
‘null’是一个特殊类型,指针指向空地址
const obj1={x:100,y:200}
const obj2=obj1
let x1=obj1.x
obj2.x=101
x1=102
console.log(obj1) //{x:101}
// 这里的let x1=obj.x; 是一个干扰,定义了一个数值类型,不是引用类型
二、typeof运算符
typeof能判断所有值类型,null判断出的是object
//注意判断值类型判断和引用类型
//注意判断是数组还是对象
//递归
//手写深拷贝
<script>
arr=[100, [{a : 'hello'}, {b : "world"}], { c: "123456789" }];
//判断修改的是不是'object'或者null,如果不是 object 或者 null 那么直接返回
function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
return obj;
}
let result;
//判断上面下来的obj是不是数组 用instanceof来检测 因为是数组引用类型
obj instanceof Array?result=[]:result={}
for (var item in obj) {
//查找一个对象是否有某个属性
if (obj.hasOwnProperty(item)) {
// 递归调用
result[item] = deepClone(obj[item])
}
}
return result;
}
let arr1=deepClone(arr);
arr1[1][0].a='vue'
arr1[0]=99
console.log('原数组',arr)
console.log('新数组',arr1)
</script>
三、变量计算-类型转换
1.字符串拼接
let a=100+10; //110
let b=100+'10'; //'10010'
let c=true+'10' //'true10'
2.==运算符
`==`隐式的做一些类型转换,尝试相等
// 除了==null或undefined,其他一律都用===
100=='100' //true
0=='' //true
0==false //true
false=='' //true
null==undefined //true
3.if语句和逻辑语句
如果是两步非true运算就是 truly变量
如果是两步非false运算就是 falsely变量
// 除了这些是falsely变量,其他都是truely变量
!!0===false
!!NaN===false
!!""===false
!!null===false
!!undefined===false
!!false===false
//truly变量
conse a=true;
if(a){
//...
}
//falsely变量
const c=''
if(c){
//...
}
//truly会直接返回
console.log(10&&0) //0
console.log(''||'abc') //'abc'
console.log(!window.abc) //true