简介

js基础数据类型有基础数据类型和引用数据类型

一、类型分类

1.基础数据类型

数字Number

字符串String

布尔Boolean

Undefined:字面意思就是未定义的值,一般来自一个表达式最原始的状态值,不是人为操作的结果,所以不要显式的给变量赋undefined。

1.声明未定义的变量,默认值是undefined

2.函数默认返回值是undefined

3.调用函数没有传实参,打印参数为undefined

4.对象没有的属性,打印也是undefined

Null:字面意思就是空值

1.当一个要保存对象的变量还没有真正存放对象,就可以赋值为null,以区分null和undefined,可以理解为它是一个对象引用的占位符,在堆中不占空间

2.当一个数据不再使用时,用null来解除引用,垃圾回收机制会在下次运行时将其回收

Symbol:代表独一无二的值,最大用法就是用来定义对象的唯一属性名

BigInt:可以表示任意大小的整数。Number类型有范围限制,对于非常大的整数将自动四舍五入,存在精度问题,BigInt解决了此问题

2.引用数据类型

object

array

function

二、类型转换

null和undefined进行boolean类型转换后都是false

== 和 ===的区别本质上是会不会进行类型转换

三、类型判断

1.typeof
1
2
3
4
5
6
7
8
9
10
11
console.log(typeof undefined); // undefined
console.log(typeof 1); // number
console.log(typeof true); // boolean
console.log(typeof "str"); // string
console.log(typeof Symbol()); // symbol
console.log(typeof 12345n); // bigint
console.log(typeof function () {}); // function
// 不能判别
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof null); // object
2.instanceof

原理就是顺着原型链去找,a instanceof b,能找到b.prototype,则为true,能判断引用类型,不能判断基础类型。能判断是否属于实例关系,不能判断具体是哪种类型

3.Object.prototype.toString.call(),所有都能判断
1
2
3
4
5
6
7
8
9
Object.prototype.toString.call(2); // "[object Number]"
Object.prototype.toString.call(""); // "[object String]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(Math); // "[object Math]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(function () {}); // "[object Function]"
4.constructor
1
2
// 语法:
'a'.constructor == String

注:null和undefined没有constructor,不能用此方法。函数的constructor不稳定,重写prototype后constructor就变了

5.判断是不是数组
1
Array.isArray(arr)
6.判断是不是promise,并不能严格判断是不是promise,只能退而求其次,认为是thenable对象就是promise
1
val && typeof val.then == 'function'