JS 判断数据类型的方法

79 阅读3分钟

JavaScript是一门弱类型语言,就意味着在声明变量时不需要指定数据类型,在程序运行过程中,类型会自动被确定。那要怎么确定用到变量是什么数据类型呢?我整理了几个方法,一起看看吧。

了解JS中的数据类型

基本数据类型

  • Number:基于IEEE 754标准的双精度64位二进制格式的值。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity和NaN。
  • String:用于表示和操作字符序列。
  • Boolean:布尔类型,只有true和false两个值。
  • Null:特指对象的值未设置;在布尔运算中被认为是false。
  • Undefined:一个没有被赋值的变量会有个默认值undefined;undefined是全局对象的一个属性。
  • BigInt:使用BigInt可以安全地存储和操作大整数,常常通过在整数末尾附加 n 或者调用构造函数来创建。
  • Symbol:是ES6新增的一种基本数据类型。是唯一并且不可变的原始值并且可以用来作为对象属性的键。

复杂数据类型

  • Object:对象(object)是指内存中的可以被引用的一块区域。在 JavaScript 中,对象是唯一可变的值。包括基本的对象、函数(Function)、数组(Array)和内置对象Date等。

判断类型

一、typeof

示例:

typeof "5"; // string  
typeof 5; // number
typeof null; // object
typeof undefined; // undefined
typeof true; // boolean
typeof Symbol('5'); // symbol
typeof 5n); // bigint
typeof new Object(); // bigint
typeof new Array([1,2]); // bigint
typeof new Date(); // bigint
typeof new Function(); // function

由上面例子可以看出:

  • 基本类型中,除了null被认为是空对象,返回了object外,其余都返回的正确类型。
  • 复杂类型中,除了函数返回的function,其余都是返回的object。

typeof可以判断(除null)基本数据类型,但是难以判断(除function)复杂数据类型


二、instanceof

语法:

object instanceof constructor

instanceof运算符用来检测constructor.prototype是否存在在于参数object的原型链上。

示例:

[1,2] instanceof Array; // true  
[1,2] instanceof Object; // true


var myStr = "This is a string";
myStr instanceof String; // true
myStr instanceof Object; // true

var myDate = new Date();
myDate instanceof Date; // true
myDate instanceof Object; // true
myDate instanceof String; // false

:空对象的判断问题

var myObj1 = {};
var myObj2 = Object.create(null);
var myObj3 = Object.create({});

myObj1 instanceof Object; // true
myObj2 instanceof Object; // false,Object.create(null)会造成创建的对象其__proto__指向为空
myObj3 instanceof Object; // true

由上面例子可以看出:

  • instanceof只能用来判断变量的原型链上是否有构造函数的prototype属性,不一定能获取对象的具体类型。
  • instanceof不适合判断原始类型的值

在不同的window或者iframe之间,不能使用instanceof


三、Object.prototype.toString.call

可以通过Object.prototype.toString方法返回类型字符串。但由于实例对象可能会重写toString方法,所以使用时要加上call。

示例:

Object.prototype.toString.call('5') // [object String] 
Object.prototype.toString.call(5) // [object Number] 
Object.prototype.toString.call([5]) // [object Array] 
Object.prototype.toString.call(true) // [object Boolean]
Object.prototype.toString.call(undefined) // [objectUndefined]
Object.prototype.toString.call(null) // [object Null]
Object.prototype.toString.call(new Function()); // [object Function]
Object.prototype.toString.call(new Date()); // [object Date]
Object.prototype.toString.call(new RegExp()); // [object RegExp]
Object.prototype.toString.call(new Error()); // [object Error]

四、constructor

每个实例对象都可通过constructor来访问它的构造函数,但是undefined和null是无效的对象,因此没有constructor属性。

示例:

[1,2].__proto__.constructor === Array; // true
"1".__proto__.constructor === String; // true
undefined.__proto__.constructor === Undefined; // Cannot read properties of undefined (reading '__proto__')
null.__proto__.constructor === Null; // Cannot read properties of undefined (reading '__proto__')

总结

  • typeof适用于基本类型和function类型的检测,null和复杂数据类型无法判断。
  • instanceof适用于判断某个对象是否是某一构造函数的实例.
  • Object.prototype.toString.call可判断所有类型。
  • constructor能判断除undefined和null之外的所有类型。