JS数据类型及类型判断

数据类型

  JS 数据类型分为两类:原始数据类型和引用数据类型。

原始数据类型

  原始数据类型的特点:值保存在变量本地,且赋值给其他变量后,其它变量改变不影响原来的值,变量存放在栈区(栈区指内存里的栈内存)。
  原始数据类型有七种,分别是NumberStringBooleanNullUndefinedSymbolBigInt

引用数据类型

  引用数据类型的特点:引用类型的值是可变的;引用类型的值是保存堆内存中的对象;引用数据类型值的比较本质上是内存地址的比较。
  引用数据类型包括 ObjectArrayRegExpDateFunction等(在 JS 中除了基本数据类型以外的都是对象,如数组、函数、正则表达式等)。

数据类型判断方法

  常用的数据类型判断方法有 3 种:typeofinstanceofObject.prototype.toString.call()

typeof

  typeof操作符返回一个字符串,表示未经计算的操作数的类型。对于原始类型来说,除了null都可以调用typeof显示正确的类型,但对于引用数据类型,除了函数之外,都会显示object

1
2
3
4
5
6
7
8
console.log(typeof "hello"); // string
console.log(typeof 123); // number
console.log(typeof true); // boolean
console.log(typeof Symbol()); // symbol
console.log(typeof undefined); // undefined
console.log(typeof [1, 2, 4]); // object
console.log(typeof null); // object
console.log(typeof function () {}); // function

  关于typeof null === object的问题:在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于null代表的是空指针(大多数平台下值为0x00),因此,null的类型标签是 0,typeof null 也因此返回 object

instanceof

  引用类型的可以用instanceof来检测,但是instanceof无法准确判断 Function

1
2
3
4
5
6
console.log({} instanceof Object); // true
console.log([] instanceof Array); // true
console.log(/\d/ instanceof RegExp); // true
console.log(new Date() instanceof Date); // true
console.log(function () {} instanceof Function); // true
console.log(function () {} instanceof Object); // true

Object.prototype.toString.call()

  Object.prototype.toString.call()是对象的一个原生原型扩展函数,适用于所有类型的判断检测。

1
2
3
4
5
6
7
8
9
10
console.log(Object.prototype.toString.call(function () {})); // [object Function]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(new Error())); // [object Error]
console.log(Object.prototype.toString.call(/\d+/)); // [object RegExp]
console.log(Object.prototype.toString.call(123)); // [object Number]
console.log(Object.prototype.toString.call("123")); // [object String]
console.log(Object.prototype.toString.call(Symbol())); // [object Symbol]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call({})); // [object Object]