JS数据类型判断
一、前言
关于数据类型,面试中考点还是挺多的,最常见的提问方式是基本数据类型,堆栈内存中分别存储哪些,typeof
和instanceof
对于数据类型判断的应用(深浅克隆判断key),看了很多遍还是容易忘,特此记录
二、正文
关于数据类型常见面试题,持续补充中……
2.1 JS数据类型有哪些
这个很常规了,主要分为基本数据类型和引用数据类型,其中基本数据类型有Number
,Boolean
,String
,Null
,Undefined
,Symbol(ES6提出)
,BigInt(chrome67提出,操作大整数)
基本数据类型保存在栈内存中
引用数据类型是Object
,Object是所有引用数据类型的顶级父类,通过原型链可以看到,包含的子类有Function
,Date
,Array
等,引用数据类型保存在堆内存中
2.2 typeof
typeof
可以判断出非null
类型的基本数据类型,引用类型只能判断出是object
还是function
看个例子
1 | console.log(typeof 1); |
结果
1 | number |
typeof
null的结果是null,javascript
中的又一大败笔!!!在ECMA6中,曾经有提案为历史平凡, 将
typeof
null的值纠正为null,但最后提案被拒了,理由是历史遗留代码太多,不想得罪人,不如继续将错就错当和事老
2.3 instanceof中奇怪的地方
面试问过!!!
通过字面量创建的字符串和通过构造函数创建的字符串,instanceof
返回结果是什么
1 | let str = "this is a test"; |
mdn中的解释是String
的原型不在str
的原型链上,好吧,你说是就是吧,然后又有下面这个例子
1 | let obj = {}; |
都是字面量,javascript引擎却做了两种不同的处理,算双标吗?
JS真的很灵活(来源于各种败笔)
2.4 判断是否是实例的正确方式
1 | if (!(mycar instanceof Car)) { |
反例:
1 | if (!mycar instanceof Car) |
因为
!
优先级高于instanceof
2.5 判断类型的正确方式
1 | function _typeof(aim) { |
toString
方法返回[object Number]这种类型,我们想要的就是Number,就用slice截取
解释一下第二个参数为负数的处理过程
第二个参数为endIndex,在该索引(以 0 为基数)处结束提取字符串。如果省略该参数,
slice()
会一直提取到字符串末尾。如果该参数为负数,则被看作是 strLength + endIndex,这里的 strLength 就是字符串的长度(例如,如果 endIndex 是 -3,则是, strLength - 3)。
也就是截取到倒数第一位停止