数据类型
Yogae 健身狂魔

JavaScript中什么是基本数据类型什么是引用类型?以及各个数据类型是如何存储的?

基本数据类型有:U ARE SO NB
U(undefined) S(string symbol) N(null number) B(boolean BigInt)
引用类型统称为Object类型
细分的话有:Object,array,date,RegExp,Function
基本数据类型的数据直接存储在栈中,而引用数据类型是存储在堆中,每个对象在栈地址都会有一个引用地址,引用类型在栈空间都会保存自己的引用地址,以便快速找到堆内存中的对象。栈内存是自动分配内存的。而堆内存是动态分配内存的,不会自动释放,所以每次使用完对象的时候都要将它设置为NULL ,从而减少无用内存的消耗


类型转换

在JavaScript中为什么0.2+0.1>0.3?

因为在JavaScript中,浮点数是由64位固定长度来表示的,其中1位表示符号位,11位表示指数位,剩下的52位表示尾数位,由于只有52位尾数位,而0.1转为二进制时是0.0001100110011001100…(1100循环)


十进制转二进制方法:这里插入一个地址谢谢!!!

由于只能存储52位尾数位,所以便存在精度缺失,把它从内存中取出来转换成十进制就不是原来的0.1了,变成0.10000000…555111。
而0.2+0.1是因为0.2和0.1都转换为二进制进行计算,转换为十进制正好是0.30000…004


这时候面试官又会说了 那为什么0.2+0.3=0.5捏???

嗯?因为0.2和0.3先转化为二进制进行计算,结果是0.10000…001 这时候1的尾数是大于52位,而实际数取值是取52位尾数位的!因此截取后便是0.5


这时候面试官还是那么可爱 又问既然0.1不是0.1了!那为什么输出console.log(0.1)的时候还是0.1呢?

这里其实我也不懂,正确答案:在console.log的时候会二进制转换为十进制,十进制会转换为字符串形式,在转换过程中会取近似值,所以打印出来的是一个近似值的字符串!哦耶~


判断数据类型有几种方法?//四种

最常用的判断方法:typeof

缺点:typeof null的值为object 无法分辨是null还是object


判断已知对象的方法:instanceof

缺点:无法判断对象是否存在自己的原型链上


根据对象的construct判断:
注意:construct在类继承时会出错


通用但很繁琐的方法:object.prototype.toString.call()



instanceof原理

instanceof就是查找目标对象的原型链


为什么typeof null是object

这其实是个BUG,因为在JavaScript中,不同对象都是用二进制存储的,如果二进制前三位数为0的话,系统会判断为object类型,而null的前三位数刚好是0,所以也变成了object类型


== 和 === 有什么区别?

===是严格意义上的相等,会比较数据类型和值大小

数据类型不同,返回flase
数据类型相同,但值大小不同,返回flase

==是非严格意义上的相等,会比较值的大小

数据类型相同,比较值大小
数据类型不同,会根据以下表格,再进一步比较。

    Null == undefined -> true
    String == Number -> 先将String转换为Number,再比较大小
    Boolean == Number -> 先将Boolean转换为Number,再比较大小
    Object == String,Number,Symbol -> Object转换为原始类型

手写call,apply,bind

本宝宝暂时不会,过两天学完来补上嘻嘻嘻🤭


字面量创建对象和new创建对象有什么区别,new内部都实现了什么,手写一个new

字面量:

字面量创建对象更简单,方便阅读
不需要作用解析,速度更快

    let person = {
        name : '小宇子',
        age : '21',
        loc : '汕头',
        skill : function(){
            alert('唱跳RAP');
        }
    }
    console.log(function.skill());

new创建对象:

创建一个new对象
不懂了回去补知识。。。!!!