JavaScript类型检测【全】

类型检测的方法:

  1. typeof
  2. instanceof
  3. Object.prototype.toString
  4. constructor

typeof

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

js 复制代码
typeof undefined;
// "undefined"

typeof null;
// "object"

typeof 100;
// "number"

typeof NaN;
// "number"

typeof true;
// "boolean"

typeof 'foo';
// "string"

typeof function () {};
// "function"

typeof [1, 2];
// "object"

typeof new Object();
// "object"

typeof 操作符适合对 基本类型 (除 null 之外)及 function 的检测使用,而对引用数据类型(如 Array)等不适合使用。

instanceof

instanceof 运算符用于检测一个对象在其 原型链 中是否存在一个构造函数的 prototype 属性。

左操作数为对象,不是就返回 false,右操作数必须是 函数对象 或者 函数构造器,不是就返回 TypeError 异常。

js 复制代码
function Person() {}
function Student() {}
Student.prototype = new Person();
Student.prototype.constructor = Student;

const ben = new Student();
ben instanceof Student;
// true

const one = new Person();
one instanceof Person;
// true
one instanceof Student;
// false
ben instanceof Person;
// true

任何一个构造函数都有一个 prototype 对象属性,这个对象属性将用作 new 实例化对象的原型对象。

📍 instanceof 适合用于判断对象是否属于 Array、Date 和 RegExp 等内置对象。

📍 不同 window 或 iframe 之间的对象类型检测无法使用 instanceof 检测。

Object.prototype.toString

可以通过 toString() 来获取每个对象的类型。

为了 每个对象 都能通过 Object.prototype.toString 来检测,需要以 Function.prototype.call 或者 Function.prototype.apply 的形式来调用,传递要检查的对象作为第一个参数。

js 复制代码
Obejct.prototype.toString.call(undefined);
//  "[object Undefined]"

Obejct.prototype.toString.call(null);
//  "[object Null]"

Obejct.prototype.toString.call(true);
//  "[object Boolean]"

Obejct.prototype.toString.call('');
/// "[object String]"

Obejct.prototype.toString.call(123);
//  "[object Number]"

Obejct.prototype.toString.call([]);
//  "[object Array]"

Obejct.prototype.toString.call({});
//  "[object Object]"

💡 使用 Object.prototype.toString 方法能精准地判断出值的数据类型。

⚠️ 注意事项:

方法重写:Object.prototype.toString 属于 Object 的原型方法,而 Array 或 Function 等类型作为 Object 的实例,都重写了 toString 方法。因此,不同对象类型调用 toString 方法时,调用的是重写后的 toString 方法,而非 Object 上原型 toString 方法,所以采用 xxx.toString() 不能得到其对象类型,只能将 xxx 转换成字符串类型。

constructor

任何对象都有 constructor 属性,继承自原型对象,constructor 会指向构造这个对象的构造器或构造函数。

js 复制代码
Student.prototype.constructor === Student;
//  true

数组检测

ECMAScript5 将 Array.isArray() 正式引入 JavaScript,该方法能准确检测一个变量是否为数组类型。

js 复制代码
Array.isArray(variable);
相关推荐
前端 贾公子13 小时前
ElementUI 中 validateField 对部分表单字段数组进行校验时多次回调问题
前端·javascript·elementui
棒棒的唐13 小时前
vue2 elementUI 登录页面实现回车提交登录的方法
前端·javascript·elementui
一只乔哇噻13 小时前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
钮钴禄·爱因斯晨13 小时前
深入剖析LLM:从原理到应用与挑战
开发语言·人工智能
知识分享小能手13 小时前
React学习教程,从入门到精通,React 使用属性(Props)创建组件语法知识点与案例详解(15)
前端·javascript·vue.js·学习·react.js·前端框架·vue
六点半88813 小时前
【C++】C++11 篇二
开发语言·c++
DDDDDDDRDDR14 小时前
C++容器:list
开发语言·c++·stl
Elnaij14 小时前
从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元
开发语言·c++
chen_ever14 小时前
golang之go modules
开发语言·后端·golang
摸鱼的春哥14 小时前
前端程序员最讨厌的10件事
前端·javascript·后端