javascript检测数据类型的方法

ops/2024/11/15 1:42:03/

1. typeof 运算符

typeof是一个用来检测变量的基本数据类型的运算符。它可以返回以下几种类型的字符串:“undefined”、“boolean”、“number”、“string”、“object”、“function” 和 “symbol”(ES6+)。需要注意的是,对于 null 和 array,typeof 都返回 “object”,这可能导致一些混淆。

javascript">javascript
console.log(typeof 42);             // "number"
console.log(typeof 'Hello');        // "string"
console.log(typeof true);           // "boolean"
console.log(typeof {});             // "object"
console.log(typeof []);             // "object"
console.log(typeof null);           // "object"
console.log(typeof function() {});  // "function"
  1. 优点:
  • 直接且易于理解,用于基础数据类型的检测非常有效。
  1. 缺点:

对于复杂类型(如数组、null、正则表达式),返回的结果不够准确。例如,数组和普通对象都返回 “object”,null 也返回 “object”,这可能会导致误解。

2. instanceof 运算符

instanceof 用于检测一个对象是否是另一个对象的实例。它可以用于检查对象的构造函数。

javascript">console.log([] instanceof Array);        // true
console.log({} instanceof Object);       // true
console.log(new Date() instanceof Date); // true
console.log(/regex/ instanceof RegExp);  // true
console.log([] instanceof Object);       // true (数组也是对象)
  1. 优点:
  • 能够检查对象的构造函数,区分不同的对象类型(例如区分数组和普通对象)。
  1. 缺点:

对于跨窗口或跨框架的对象,instanceof 可能无法正确识别,因为它依赖于构造函数的 prototype。例如,在不同的浏览器窗口中创建的对象可能无法识别。

  1. 改进:

可以用 Object.prototype.toString.call() 来补充这种情况下的类型检测。

3. Array.isArray()

Array.isArray() 方法用于检测一个对象是否是数组。这是 typeof 和 instanceof 无法直接检测数组的情况。

javascript">console.log(Array.isArray([]));          // true
console.log(Array.isArray({}));          // false
console.log(Array.isArray('string'));    // false
console.log(Array.isArray(new Array())); // true
  1. 优点:
  • 专门用于检测数组,避免了 typeof 对数组的模糊处理。
  1. 缺点:
  • 仅限于数组检测,对于其他数据类型不适用。

改进:

适用于需要明确检测数组的场景,如数组操作前的验证。

4. Object.prototype.toString.call()

Object.prototype.toString.call() 方法提供了最准确的方式来检测对象的原始类型,包括Array、Date、RegExp 等。

javascript">console.log(Object.prototype.toString.call([]));           // "[object Array]"
console.log(Object.prototype.toString.call({}));           // "[object Object]"
console.log(Object.prototype.toString.call(new Date()));    // "[object Date]"
console.log(Object.prototype.toString.call(/regex/));       // "[object RegExp]"
console.log(Object.prototype.toString.call(null));          // "[object Null]"
console.log(Object.prototype.toString.call(undefined));     // "[object Undefined]"
  1. 优点:
  • 提供最准确的类型检测,能够区分大多数数据类型,包括 null 和 undefined。
  1. 缺点:
  • 语法相对复杂,需要调用 Object.prototype.toString.call()。

5. Number.isNaN() 和 isNaN()

Number.isNaN() 方法用于检测一个值是否是 NaN 且其类型为 Number。
isNaN()方法则会先尝试将值转换为数字,然后再判断是否为 NaN。

javascript">console.log(Number.isNaN(NaN));         // true
console.log(Number.isNaN('string'));    // false
console.log(isNaN(NaN));                // true
console.log(isNaN('string'));           // true (因为 'string' 被转换成 NaN)
console.log(isNaN(42));                 // false
  1. 优点:
  • Number.isNaN() 准确检测 NaN,避免了 isNaN() 的类型转换问题。
  1. 缺点:
  • isNaN() 会将非数字值转换为 NaN,可能导致误判。

改进:

在需要检查 NaN 时使用 Number.isNaN(),避免 isNaN() 的类型转换问题。

6. constructor 属性

constructor 属性可以用来检测一个对象的构造函数,但这种方法不如 instanceof 可靠,因为它可能会被改变。

javascript">console.log(([]).constructor === Array);   // true
console.log(({}).constructor === Object);  // true
console.log((new Date()).constructor === Date); // true
console.log((/regex/).constructor === RegExp); // true
console.log((42).constructor === Number); // true
  1. 优点:
  • 直接检测构造函数,语法简单明了。
  1. 缺点:
  • constructor 属性可能被篡改,因此不总是可靠。例如,如果对象的 constructor 被修改,检测结果可能不准确。

7 总结

  • typeof 适用于基本数据类型的检查,但对于 null 和数组不够精确。
  • instanceof 适用于检查对象是否为特定构造函数的实例。
  • Array.isArray() 专门用于检测数组。
  • Object.prototype.toString.call() 提供了最准确的类型检测方式。
  • Number.isNaN() 用于检测 NaN,避免 isNaN() 的一些陷阱。

http://www.ppmy.cn/ops/113659.html

相关文章

C语言程序设计(进阶)

上了生活的贼船&#xff0c;那就做一个快乐的海盗。 2.3练习 下面代码输出的结果是什么&#xff1f; #include <stdio.h> int main() { char a -1; signed char b -1; unsigned char c -1; printf("a%d,b%d,c%d",a,b,a); return 0; } 解析&#xff…

无人机飞手教员培训及就业分析

无人机飞手教员培训是一个综合性的教育体系&#xff0c;旨在培养具备专业飞行技能、扎实理论知识以及高效教学能力的无人机飞手导师。培训内容广泛覆盖从无人机基础知识到高级飞行技巧&#xff0c;再到教学方法与技巧&#xff0c;确保学员能够全面掌握无人机操作与教学的精髓。…

焦化行业的变革力量:智能巡检机器人

根据相关数据&#xff0c;2024年1-2月份&#xff0c;焦炭产量为8039.5万吨&#xff0c;同比增长2.1%&#xff0c;这表明&#xff0c;我国焦化行业仍是全球最大的焦炭生产国和消费国&#xff0c;其市场规模占据了重要地位。焦化企业主要集中在山西省&#xff0c;其合计焦炭产能约…

Unity多语言插件I2 Localization国际化应用

【就不收费了&#xff0c;要个关注不过分吧】 【图片来自插件官网&#xff0c;侵删】 前言 目前游戏往往都不会仅局限于国内语言&#xff0c;为了适应产品都要做国际化适配&#xff0c;因此会用到这个插件&#xff0c;这个插件要付费&#xff0c;因此请前往unity官网进行下载…

php环境搭建教程(超详细)

要搭建一个PHP环境&#xff0c;你可以通过多种方式来进行配置&#xff0c;下面我将提供一个从零开始的详细教程&#xff0c;适用于想在Windows、Mac或Linux上搭建PHP环境的小白用户。我们会逐步讲解如何搭建PHP环境&#xff0c;使用常见的集成开发环境&#xff08;如XAMPP、MAM…

Spring Boot-自动配置问题

**### Spring Boot自动配置问题探讨 Spring Boot 是当前 Java 后端开发中非常流行的框架&#xff0c;其核心特性之一便是“自动配置”&#xff08;Auto-Configuration&#xff09;。自动配置大大简化了应用开发过程&#xff0c;开发者不需要编写大量的 XML 配置或是繁琐的 Jav…

鸿蒙HarmonyOS之使用ArkTs语言获取应用版本等信息

一、获取BundleInfo 获取的版本号是在app.json里面配置的"versionName"参数值&#xff0c;例如: 1.0.0 1、获取应用版本号方法 import bundleManager from ohos.bundle.bundleManager;/*** 获取应用版本号*/ export async function getAppVersion(): Promise<s…

初学51单片机之IO口上下拉电阻相关

本案本来是描述一下I2C总线的&#xff0c;在此之前推荐一下B站一个UP关于时序图的讲解 I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 不过在描述I2C前先简单的探讨下51单片机IO口下拉电阻的基本情况&#xff0c;事实上这个问题困扰笔者很长时间了&#xff0c;这次也是一…