【编程向导】-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)等不适合使用。

更详细信息请查阅 typeof 操作符

instanceof

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

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

js 复制代码
obj instanceof constr;
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 检测。

更详细信息请查阅 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);
相关推荐
申朝先生30 分钟前
用CSS画一条0.5px的线
前端·javascript·css
愚戏师1 小时前
Python :数据模型
开发语言·python
慕瑶琴1 小时前
SQL语言的编译原理
开发语言·后端·golang
雪碧聊技术1 小时前
element-plus中Autocomplete自动补全输入框组件的使用
前端·javascript·vue.js·自动补全输入框·autocomplete
dorabighead4 小时前
重构版:JavaScript 的 new 操作符——从“黑箱仪式”到“亲手造物”的认知跃迁
开发语言·javascript·重构
Humbunklung4 小时前
C#中通过Response.Headers设置自定义参数
开发语言·c#
Trouvaille ~5 小时前
【Java篇】一法不变,万象归一:方法封装与递归的思想之道
java·开发语言·面向对象·javase·递归·方法·基础入门
Perfect—完美5 小时前
Vue 3 事件总线详解:构建组件间高效通信的桥梁
前端·javascript·vue.js
Antonio9155 小时前
【设计模式】原型模式
c++·设计模式·原型模式