返回

别再闷头硬学JS类型判断,用好它让你事半功倍!

前端

七种JS类型判断方法的详解

1. typeof 操作符

typeof 操作符是最简单、最常用的类型判断方法。它返回一个字符串,表示变量的数据类型。例如:

typeof 1; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object"
typeof Symbol(); // "symbol"
typeof function() {}; // "function"
typeof []; // "object"
typeof {}; // "object"

2. instanceof 操作符

instanceof 操作符用于判断一个对象是否属于某个类的实例。例如:

1 instanceof Number; // false
"hello" instanceof String; // true
true instanceof Boolean; // false
undefined instanceof Undefined; // false
null instanceof Null; // false
Symbol() instanceof Symbol; // true
function() {} instanceof Function; // true
[] instanceof Array; // true
{} instanceof Object; // true

3. constructor 属性

constructor 属性返回一个对象的构造函数。例如:

1.constructor === Number; // true
"hello".constructor === String; // true
true.constructor === Boolean; // true
undefined.constructor === Undefined; // false
null.constructor === Null; // false
Symbol().constructor === Symbol; // true
function() {}.constructor === Function; // true
[].constructor === Array; // true
{}.constructor === Object; // true

4. Object.prototype.toString 方法

Object.prototype.toString 方法返回一个字符串,表示对象的类型。例如:

Object.prototype.toString.call(1); // "[object Number]"
Object.prototype.toString.call("hello"); // "[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(Symbol()); // "[object Symbol]"
Object.prototype.toString.call(function() {}); // "[object Function]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call({}); // "[object Object]"

5. Object.prototype.toString.apply 方法

Object.prototype.toString.apply 方法与 Object.prototype.toString 方法类似,但它可以将任何值作为第一个参数。例如:

Object.prototype.toString.apply(1); // "[object Number]"
Object.prototype.toString.apply("hello"); // "[object String]"
Object.prototype.toString.apply(true); // "[object Boolean]"
Object.prototype.toString.apply(undefined); // "[object Undefined]"
Object.prototype.toString.apply(null); // "[object Null]"
Object.prototype.toString.apply(Symbol()); // "[object Symbol]"
Object.prototype.toString.apply(function() {}); // "[object Function]"
Object.prototype.toString.apply([]); // "[object Array]"
Object.prototype.toString.apply({}); // "[object Object]"

6. 判断变量的类型的方法推荐

  1. typeof是最常用也最简单的一种方法;
  2. instanceof 是判定引用类型是否是指定类型对象的最佳选择。对于Object类型,通常会搭配typeof进行使用,先确认是否是对象,再通过instanceof来判断具体类型;
  3. constructor通常用于判定对象所属的类,不建议直接判断具体类型;
  4. Object.prototype.toString.call可用于判断所有的类型,但在判断Object类型时往往得不到我们想要的结果。通过Object.prototype.toString.apply结合typeof能解决这一问题;
  5. 法6适合需要使用正则的情况。

7. 需要注意的点

  1. 不要只用typeof来判断Object的类型,因为它会返回“object”结果,这样不能明确知道是哪种Object类型;
  2. 不要使用==或===来比较不同类型的变量,它会得到不准确的结果;
  3. 使用instanceof来判断引用类型时,要注意判断的顺序,因为有些类继承自其他类,如果判断顺序不对,可能会得到错误的结果;
  4. 注意Object.prototype.toString.call()和Object.prototype.toString.apply()的区别,因为它们返回的字符串格式不同;
  5. 根据不同的场景选择合适的方法来判断类型。