js变量

88 阅读2分钟

1、类型分类

(1)值类型,存在栈中(栈,从上到下)

  • Number
  • String
  • Boolean
  • undefined
  • Symbol(es6新增)

微信截图_20210824145048.png

(2)引用类型,存在堆中(堆,从下到上)

  • Object
  • Array
  • Function(特殊的引用类型,不能存储数据,所有没有复制、拷贝函数一说)
  • null(特殊的引用类型,指向一个空地址)

微信截图_20210824145058.png

2、typeof(返回的是字符串)

能识别所有的值类型 识别函数 判断是否是引用类型(不可再细分,细分用instanceof;instanceof原理实际就是查找目标对象的原型链)

3、深浅拷贝(答案放在最后)


let obj1={
    name:'zhangsan',
    age:18,
    likes:['001','002','003'],
    have:{
        x:{
            y:{
                z:'hi boy!'
            }
        }
    },
    say:'hello,我是张三'
}

// 手写深拷贝
function deepClone(obj={}){
    // obj是null或者不是数组或对象
    if(typeof obj !== 'object' || obj == null){
        return obj
    }

    // 初始化结果
    let result
    if(obj instanceof Array){
        result=[]
    }else{
        result={}
    }

    // 遍历、递归***
    for(let key in obj){
        result[key]=deepClone(obj[key])
    }

    // 返回结果
    return result
}

/**
* 浅拷贝
* obj1直接复制给obj2
* obj2执行obj1的内存地址
* 修改obj2影响obj1
*/
let obj2=obj1
obj2.say="hello,我是赵四"
console.log('浅拷贝,修改副本,影响原件',obj1.say);

/**
* 深拷贝
* 递归是重点
* 修改obj3不影响obj1
*/
let obj3=deepClone(obj1)
obj3.say='hello,我是王五'
console.log('深拷贝,修改副本,不影响原件',obj1.say);

4、类型转换

字符串拼接 ==(除了==null外,其他一律用===;==null相当于===null||===undefined) if语句和逻辑运算(truly变量,两步非运算后等于true的变量;falsely变量,两步非运算后等于false的变量)( && 返回第一个falsely变量; || 返回第一个truly变量;! )

5、面试题

0.1+0.2=0.3? 0.2+0.3=0.5? 思路: a,b都转为二级制进行计算,得到的结果c取52位尾数位后,再转为十进制 c1取52位尾数位后,转成的十进制数不等于0.3了 c2取52位尾数位后(52位尾数位恰巧都是0),转成的十进制数等于0.5

console.log(0.1) 思路: 0.1转成二进制,再转成十进制,再转成字符串(转换的过程中取了近似值),所以打印出来的还是0.1