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对象
不懂了回去补知识。。。!!!