JS数据类型判断

一、前言

关于数据类型,面试中考点还是挺多的,最常见的提问方式是基本数据类型,堆栈内存中分别存储哪些,typeofinstanceof对于数据类型判断的应用(深浅克隆判断key),看了很多遍还是容易忘,特此记录

二、正文

关于数据类型常见面试题,持续补充中……

2.1 JS数据类型有哪些

这个很常规了,主要分为基本数据类型和引用数据类型,其中基本数据类型有NumberBooleanStringNullUndefinedSymbol(ES6提出)BigInt(chrome67提出,操作大整数)基本数据类型保存在栈内存中

引用数据类型是Object,Object是所有引用数据类型的顶级父类,通过原型链可以看到,包含的子类有FunctionDateArray等,引用数据类型保存在堆内存中

2.2 typeof

typeof可以判断出非null类型的基本数据类型,引用类型只能判断出是object还是function
看个例子

1
2
3
4
5
6
7
8
9
10
console.log(typeof 1);
console.log(typeof NaN);
console.log(typeof "test")
console.log(typeof true)
console.log(typeof null)
console.log(typeof undefined)
console.log(typeof Symbol('1'));
console.log(typeof new Object())
console.log(typeof [])
console.log(typeof Object)

结果

1
2
3
4
5
6
7
8
9
10
number
number
string
boolean
object
undefined
symbol
object
object
function

typeof null的结果是null,javascript中的又一大败笔!!!

在ECMA6中,曾经有提案为历史平凡, 将typeof null的值纠正为null,但最后提案被拒了,理由是历史遗留代码太多,不想得罪人,不如继续将错就错当和事老

2.3 instanceof中奇怪的地方

面试问过!!!

通过字面量创建的字符串和通过构造函数创建的字符串,instanceof返回结果是什么

1
2
let str = "this is a test";
str instanceof String // false

mdn中的解释是String的原型不在str的原型链上,好吧,你说是就是吧,然后又有下面这个例子

1
2
let obj = {};
obj instanceof Object; // true

都是字面量,javascript引擎却做了两种不同的处理,算双标吗?

JS真的很灵活(来源于各种败笔)

2.4 判断是否是实例的正确方式

1
2
3
if (!(mycar instanceof Car)) {
// Do something
}

反例:

1
if (!mycar instanceof Car)

因为优先级高于instanceof

2.5 判断类型的正确方式

1
2
3
4
function _typeof(aim) {
return Object.prototype.toString.call(aim).slice(8, -1);
}
console.log(_typeof(1))

toString方法返回[object Number]这种类型,我们想要的就是Number,就用slice截取

解释一下第二个参数为负数的处理过程

第二个参数为endIndex,在该索引(以 0 为基数)处结束提取字符串。如果省略该参数,slice() 会一直提取到字符串末尾。如果该参数为负数,则被看作是 strLength + endIndex,这里的 strLength 就是字符串的长度(例如,如果 endIndex 是 -3,则是, strLength - 3)。

也就是截取到倒数第一位停止