数据类型判断

null

在JavaScript中,null 是一种特殊的原始数据类型,它表示一个明确的"无"值或者说"空值",通常用来表示变量尚未定义、已被释放或者意在指向某个对象但当前实际并未指向任何对象。虽然在历史上,typeof null 返回 "object",这是一个JavaScript语言设计上的历史遗留问题,并不意味着 null 是对象类型;实际上,null 不是对象,也不是函数,更不是数组,它就是 null 类型。

关于原型(prototype)与 null 的关系,在JavaScript中,每个对象都有一个内部链接指向它的原型,这个原型链是用来实现继承和查找属性的机制。原型链的顶端或者说终点就是一个特殊的值 null,表示没有更上层的原型了。当调用 Object.getPrototypeOf(someObject) 方法到达原型链的最顶层时,如果一个对象的原型已经是 null,那就意味着已经到达了原型链的终点,这个对象不再有其他的原型对象。

例如:

javascript 复制代码
let obj = {};
console.log(Object.getPrototypeOf(obj)); // 输出:{} 即 Object.prototype

let objWithoutPrototype = Object.create(null);
console.log(Object.getPrototypeOf(objWithoutPrototype)); // 输出:null

在这段代码中,objWithoutPrototype 是通过 Object.create(null) 创建的一个没有原型的对象,因此它的原型就直接是 null

typeof

返回一个字符串,标识操作数类型

csharp 复制代码
typeof operand

返回值

类型 结果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
BigInt "bigint"
String "string"
Symbol "symbol"
Function "function"
其他任何对象 "object"

typeof null

ini 复制代码
typeof null === "object";

JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。

对象的类型标签是 0,null 代表的是空指针(大多数平台下值为 0x00),所以类型为"object"

new构造函数

所有使用new调用的构造函数都将返回非基本类型("object""function")。大多数返回对象。functionnew出来是"function"

typeof优先级高于运算,表达式需要加括号

未声明或初始化,返回"undefined"

instanceof

instanceof 运算符用来检测构造函数 constructor.prototype 是否存在于参数实例对象 object 的原型链上。

kotlin 复制代码
object instanceof constructor

String对象和Date对象是Object派生出来的特殊对象,不属于String类型

javascript 复制代码
const myObj={}
myObj instanceof Object  // true

const myNonObj=Object.create(null)
myNonObj instanceof Object  // false

const simpleStr="This is a simple string"
simpleStr instanceof String  // false  非对象实例

const myString=new String("String created width constructor")
myString instanceof String  // true

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

基本类型使用typeof判断,对象类型使用instanceof判断

数组和对象类型的判断方法

在JavaScript中,要判断一个变量是对象类型还是数组类型,可以使用以下几种方法:

判断是否为对象(包括数组,因为数组也是对象的一个子类型):

  1. typeof 操作符

    javascript 复制代码
    if (typeof myVariable === 'object' && myVariable !== null) {
      // 如果不是 'undefined' 或 'null',则可能是对象或数组
    }
  2. instanceof 关键字

    javascript 复制代码
    if (myVariable instanceof Object) {
      // 是对象或其子类型,但不能直接区分对象和数组
    }

判断是否为数组:

  1. Array.isArray() 函数 (推荐):

    javascript 复制代码
    if (Array.isArray(myVariable)) {
      // 是数组
    } else {
      // 不是数组,但仍可能是对象
    }

特殊情况判断对象是否为数组:

  1. Array.prototype.isPrototypeOf()

    javascript 复制代码
    if (Array.prototype.isPrototypeOf(myVariable)) {
      // 是数组
    }
  2. 构造函数检查

    javascript 复制代码
    if (myVariable.constructor === Array) {
      // 是数组
    }
  3. toString() 方法配合判断

    javascript 复制代码
    if (Object.prototype.toString.call(myVariable) === '[object Array]') {
      // 是数组
    }

总结:

为了准确地判断一个变量是普通对象还是数组,请优先使用 Array.isArray() 方法,这是最简洁且无歧义的方式。如果需要进一步确认是否为非数组的对象,则可以在排除掉数组的可能性之后,使用 typeof 结合 null 检查或者 instanceof Object 等方法。

相关推荐
-To be number.wan18 分钟前
C++ 赋值运算符重载:深拷贝 vs 浅拷贝的生死线!
前端·c++
噢,我明白了34 分钟前
JavaScript 中处理时间格式的核心方式
前端·javascript
NAGNIP36 分钟前
多个 GitHub 账户SSH 密钥配置全攻略
后端
NAGNIP39 分钟前
Windows命令行代码自动补全详细步骤
后端
追逐时光者1 小时前
精选 8 款 .NET 开源、前后端分离的快速开发框架,提高开发生产效率!
后端·.net
纸上的彩虹1 小时前
半年一百个页面,重构系统也重构了我对前端工作的理解
前端·程序员·架构
be or not to be2 小时前
深入理解 CSS 浮动布局(float)
前端·css
用户47949283569152 小时前
性能提升 4000%!我是如何解决 运营看板 不能跨库&跨库查询慢这个难题的
数据库·后端·postgresql
LYFlied2 小时前
【每日算法】LeetCode 1143. 最长公共子序列
前端·算法·leetcode·职场和发展·动态规划
老华带你飞2 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端