变量类型和计算

65 阅读2分钟

值类型和引用类型

值类型:string、number、boolean、symbol、undefined

引用类型:obj、array、null(特殊引用类型,指向空指针)、function(特殊引用类型,不存储数据,没有拷贝、复制函数一说)

手写深拷贝

/**
*深拷贝
*@param {Object} obj,深拷贝对象
*/
const obj = {
    name:'deepClone',
    age:'20',
    address:{
        city:'beijing'
    },
    array:['1','2','3']
}
const cloneObj = obj;
cloneObj.address.city = 'shanghai';
// 深拷贝方法
function deepClone(obj={}){
    // 如果obj不是对象或者obj==null直接返回
    if(typeof obj !== 'object' || obj == null){
        return obj;
    }
    // 结果初始化
    let result
    // instanceof可以区分判断是一个数组对象还是一个其他构造函数的实例对象,通过判断这个对象是哪个构造函数的实例对象可以区分出来是数组还是其他的对象。
    if(obj instanceof Array){
        result = []
    }else {
        result = {}
    }
    for(key in obj){
        // 判断key是否为原型中的key
        if(obj.hasOwnProperty(key)){
            // 递归调用
            resule[key] = deepClone(obj[key])
        }
    }
    return result;
}
console.log(obj,'原obj');
console.log(obj2,'深拷贝obj');

变量计算-类型转换

字符型拼接
const a = 100 + 10; // 110 
const b = 100 + '10'; // 10010 
const c = true + '10'; // true10 
const d = 100 + prseInt('10'); // 110
==运算符
100 == '100' //true 
0 == '' // true 
0 == false // true 
false == '' // true 
null == undefined // true 
if(obj.a == null){} // 相当于:if(obj.a === null || obj.a === undefined){}

if语句和逻辑运算

truthy变量:!!a === true的变量

falsly变量:!!a === false的变量

变量经过两步非运算等于true就是truthy变量;等于false就是falsly变量

// 以下都是falsy变量,除此以外都是truthy变量 
!!0 === false 
!!NaN === false 
!!'' === false 
!!null === false 
!!undefined === false 
!!false === false

逻辑运算

console.log(10 && 0) // 返回0,因为10是truthy变量,接着进行判断,所以返回第二个值;如果是falsy变量就直接返回 
console.log('' || 'abc') // 返回'abc',因为''是falsy变量,所以接着判断,返回第二个值;如果是truthy变量就直接返回 
console.log(!window.abc) // true,直接返回