首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有办法只检查一个普通的javascript对象,而不是其他任何特殊类型的对象(如Date)?

在JavaScript中,如果你想要检查一个对象是否是一个普通的对象,而不是其他特殊类型的对象(如Date、Array、RegExp等),你可以使用多种方法来实现这一点。以下是一些常见的方法:

方法一:使用 Object.prototype.toString.call()

Object.prototype.toString.call() 方法可以返回一个表示对象类型的字符串。对于普通对象,它会返回 "[object Object]"

代码语言:txt
复制
function isPlainObject(obj) {
  return Object.prototype.toString.call(obj) === '[object Object]';
}

console.log(isPlainObject({})); // true
console.log(isPlainObject(new Date())); // false
console.log(isPlainObject([])); // false

方法二:检查构造函数

你可以检查对象的构造函数是否是 Object

代码语言:txt
复制
function isPlainObject(obj) {
  return obj && typeof obj === 'object' && obj.constructor === Object;
}

console.log(isPlainObject({})); // true
console.log(isPlainObject(new Date())); // false
console.log(isPlainObject([])); // false

方法三:使用 lodash

如果你已经在项目中使用了 lodash 库,可以直接使用 _.isPlainObject() 方法。

代码语言:txt
复制
const _ = require('lodash');

console.log(_.isPlainObject({})); // true
console.log(_.isPlainObject(new Date())); // false
console.log(_.isPlainObject([])); // false

应用场景

  • 数据验证:在处理用户输入或外部数据时,确保数据是一个普通的对象,而不是其他类型的对象。
  • 库和框架开发:在编写库或框架时,需要确保传入的对象是一个普通对象,以便进行进一步的处理。
  • 代码优化:在某些情况下,知道对象的类型可以帮助优化代码逻辑。

可能遇到的问题及解决方法

问题:为什么 isPlainObject(new Date()) 返回 false

原因new Date() 创建的是一个 Date 对象,而不是一个普通的对象。Date 对象有自己的构造函数 Date,因此不符合普通对象的定义。

解决方法:使用上述方法之一来明确检查对象是否为普通对象。

通过这些方法,你可以有效地检查一个对象是否是普通的JavaScript对象,从而在开发过程中避免潜在的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js数据类型很简单,却也不简单

比较特殊的是,undefined是Undefined类型中的唯一一个值;同样地,null是Null类型中的唯一一个值。...为什么说Symbol是原始类型,而不是对象类型呢?因为我们知道,大部分程序员都是没有对象的,那么要想找到女朋友,最快的办法就是new一个。...,普通对象,其他特殊对象 那么如何准确地知道一个变量的数据类型呢?...基本思想是:首先看typeof是不是返回"object",如果不是,说明是普通数据类型,那么直接返回typeof运算结果即可;如果是,则需要先把null这个坑货摘出来,然后依次判断其他对象类型。...因为Object是基类,而各个派生类,如Date, Array等在继承Object的时候,一般都重写(overwrite)了toString方法,用以表达自身业务,从而失去了判断类型的能力。

1.3K30

《现代Javascript高级教程》JavaScript深拷贝与浅拷贝

浅拷贝和深拷贝是两种常用的拷贝方式。浅拷贝只复制对象的引用,而深拷贝创建了一个全新的对象,包含与原始对象相同的值和结构。深拷贝和浅拷贝各有适用的场景和注意事项。...深拷贝的实现 实现一个完整而优雅的深拷贝函数需要考虑以下几个方面: 1.1 基本类型和特殊类型的处理 在实现深拷贝函数时,首先需要处理基本类型(如字符串、数字、布尔值等)和特殊类型(如函数、正则表达式和日期对象等...浅拷贝的实现 与深拷贝不同,浅拷贝只复制对象的引用,而不创建对象的副本。...它只会复制源对象的属性的引用,而不是属性的值。...结论 深拷贝和浅拷贝是JavaScript中常用的拷贝方式,每种方式都有其适用的场景和注意事项。通过实现一个完整而优雅的深拷贝函数,我们可以轻松地创建对象的独立副本,并处理循环引用和特殊类型。

62320
  • 再谈javascriptjs原型与原型链及继承相关问题

    初始化内部属性 :这一步骤不是必要的。通俗点说,就是,对”复制品”不满意,我们可以”再加工”,使之获得不同于”模板”的”个性”。 所以在JavaScript的世界里,万物皆对象这个概念从一而终。...这些类型与其他内置对象类型相似,但同时具有各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值得时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。...普通的内置对象与基本包装类型的主要区别就是对象的生命期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中,而自动创建的基本包装类型的对象,则只是存在于一行代码的执行瞬间...但是原型对象只存在于函数对象。也就是本质上只要是通过new Function创建的函数对象会有一个原型对象。 而对于其他非Function的引用类型归根结底也是通过new Function创建的。...与undefined相比,null被认为是“期望一个对象,但是不引用任何对象的值”,而undefined是纯粹的“没有值”。

    53620

    万字长文带你走进 JavaScript 的世界

    如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。 返回值  ① 一个新的 RegExp 对象,具有指定的模式和标志。...如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。  ...通过使用全局对象,可以访问所有其他所有预定义的对象、函数和属性。全局对象不是任何对象的属性,所以它没有名称。   在顶层 JavaScript 代码中,可以用关键字 this 引用全局对象。...全局对象是作用域链的头,还意味着在顶层 JavaScript 代码中声明的所有变量都将成为全局对象的属性。   全局对象只是一个对象,而不是类。既没有构造函数,也无法实例化一个新的全局对象。...在 JavaScript 代码嵌入一个特殊环境中时,全局对象通常具有环境特定的属性。

    1.3K20

    JavaScript权威指南 - 函数

    相对于其他面向对象语言,在JavaScript中的函数是特殊的,函数即是对象。JavaScript可以把函数赋值给变量,或者作为参数传递给其他函数,甚至可以给它们设置属性等。...实参类型 声明JavaScript函数时形参不需要指定类型,在形参传入函数体之前也不会做任何类型检查,但是JavaScript在必要的时候会进行类型转换,例如: function mult(a, b)...作为命名空间的函数 函数中声明的变量只在函数内部是有定义,不在任何函数内声明的变量是全局变量,它在JavaScript代码中的任何地方都是有定义的。...JavaScript中没有办法声明只在一个代码块内可见的变量的。基于这个原因,常常需要定义一个函数用作临时的命名空间,在这个命名空间内定义的变量都不会污染到全局变量。...d 书写闭包的时候还需注意一件事,this是JavaScript的关键字,而不是变量。

    2.9K30

    面试前必备的 JavaScript 基础知识梳理总结

    对象 对象是具有一些特殊特性的关联数组。 它们存储属性(键值对),其中: 属性的键必须是字符串或者 symbol(通常是字符串)。 值可以是任何类型。...JavaScript 中还有很多其他类型的对象: Array 用于存储有序数据集合, Date 用于存储时间日期, Error 用于存储错误信息。 ……等等。...有时候大家会说“Array 类型”或“Date 类型”,但其实它们并不是自身所属的类型,而是属于一个对象类型即 “object”。它们以不同的方式对 “object” 做了一些扩展。 12....与普通对象 Object 的不同点: 任何键、对象都可以作为键。 有其他的便捷方法,如 size 属性。 Set —— 是一组唯一值的集合。...和其他系统不同,JavaScript 中时间戳以毫秒为单位,而不是秒。 有时我们需要更加精准的时间度量。JavaScript 自身并没有测量微秒的方法(百万分之一秒),但大多数运行环境会提供。

    81020

    lodash 是如何做类型检测的

    对应 lodash 中的检测函数有 isNumber 检查 value 是否是原始 Number 数值型 或者 对象; isInteger 检查 value 是否为一个整数; isNaN 检测 value...function isUndefined(value) { return value === undefined; } Null Null 类型是只有一个值的数据类型,这个特殊的值是 null 。...与 undefined 不同的是,它是一个字面量,而 undefined 是全局对象的一个属性。 从逻辑角度来看,null 值表示一个空对象指针,null 是表示缺少的标识,指示变量未指向任何对象。...它有一个很重要的用途,就是在 JavaScript 中的所有对象都来自 Object;所有对象从Object.prototype继承方法和属性,尽管它们可能被覆盖。...Array Array 在 ECMAScript 中代表数组,它的每一项可以保存任何类型的数据。

    1.7K20

    JavaScript 面试必备的基础知识梳理(71个知识点)

    对象 对象是具有一些特殊特性的关联数组。 它们存储属性(键值对),其中: 属性的键必须是字符串或者 symbol(通常是字符串)。 值可以是任何类型。...JavaScript 中还有很多其他类型的对象: Array 用于存储有序数据集合, Date 用于存储时间日期, Error 用于存储错误信息。 ……等等。...有时候大家会说“Array 类型”或“Date 类型”,但其实它们并不是自身所属的类型,而是属于一个对象类型即 “object”。它们以不同的方式对 “object” 做了一些扩展。 12....与普通对象 Object 的不同点: 任何键、对象都可以作为键。 有其他的便捷方法,如 size 属性。 Set —— 是一组唯一值的集合。...和其他系统不同,JavaScript 中时间戳以毫秒为单位,而不是秒。 有时我们需要更加精准的时间度量。JavaScript 自身并没有测量微秒的方法(百万分之一秒),但大多数运行环境会提供。

    1.3K10

    【万字长文】TypeScript入门指南

    javascript 和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,那我们操作啥呢? 实际上,是操作对象的引用,引用类型的值是按引用访问的。...,赋值结束后,是没办法进行一个修改和增加的操作的数组类型(TS -- 4)普通的声明方式//类型加中括号let arr:number[] = [123]//这样会报错定义了数字类型出现字符串是不允许的let...那是因为我们需要的并不是所有类型都能通过,我只希望这两个或者3个类型能够通过,如果需要的类型超过或着达到两个都使用any的话,那就和JavaScript原生没有区别了//例如我们的手机号通常是13XXXXXXX...静态代码块不能出现在任何方法体内对于普通方法:普通方法是需要加载类 new 出一个实例化对象,通过运行这个对象才能运行代码块,而静态方法随着类加载就运行了。...注:不是优先于构造函数执行,而是依托于构造函数,如果不创建对象就不会执行构造代码块普通代码块和构造代码块的区别在于,构造代码块是在类中定于的,而普通代码块是在方法体中定义的,执行顺序和书写顺序一致。

    62242

    TypeScript手记(三)

    colour 而不是 color。...对象字面量会被特殊对待而且会经过额外属性检查,当将它们赋值给变量或作为参数传递的时候。如果一个对象字面量存在任何“目标类型”不包含的属性时,你会得到一个错误。...函数类型 接口能够描述 JavaScript 中对象拥有的各种各样的外形。除了描述带有属性的普通对象外,接口也可以描述函数类型。 为了使用接口表示函数类型,我们需要给接口定义一个调用签名。...) { } } 接口描述了类的公共部分,而不是公共和私有两部分。...当你有一个庞大的继承结构时这很有用,但要指出的是你的代码只在子类拥有特定属性时起作用。这个子类除了继承至基类外与基类没有任何关系。

    91120

    再看JavaScript,那些遗漏或易混淆的知识点(1)

    另一方面,undefined 和 null 在相等性检查 == 中不会进行任何的类型转换,它们有自己独立的比较规则,所以除了它们之间互等外,不会等于任何其他的值。...NaN 是一个特殊的数值型值,它与任何值进行比较都会返回 false。...(3) 返回 false 是因为这是一个相等性检查,而 undefined 只与 null 相等,不会与其他值相等。...但是,如果这有一个 return 语句,那么规则就简单了: 如果 return 返回的是一个对象,则返回这个对象,而不是 this。 如果 return 返回的是一个原始类型,则忽略。 可选链 ?....例如,Date 对象可以相减,date1 - date2 的结果是两个日期之间的差值。 至于字符串转换 —— 通常发生在我们像 alert(obj) 这样输出一个对象和类似的上下文中。

    71900

    再看JavaScript,那些遗漏或易混淆的知识点(1)

    另一方面,undefined 和 null 在相等性检查 == 中不会进行任何的类型转换,它们有自己独立的比较规则,所以除了它们之间互等外,不会等于任何其他的值。...NaN 是一个特殊的数值型值,它与任何值进行比较都会返回 false。...(3) 返回 false 是因为这是一个相等性检查,而 undefined 只与 null 相等,不会与其他值相等。...但是,如果这有一个 return 语句,那么规则就简单了: 如果 return 返回的是一个对象,则返回这个对象,而不是 this。 如果 return 返回的是一个原始类型,则忽略。 可选链 ?....例如,Date 对象可以相减,date1 - date2 的结果是两个日期之间的差值。 至于字符串转换 —— 通常发生在我们像 alert(obj) 这样输出一个对象和类似的上下文中。

    71521

    我不知道的前端(二)

    求值先定义的操作数,如果其左操作数不是null或undefined,就返回该值,??只会在第一个操作数求值为null或者undefined时才会求第二个值 ps:有没有发现和||很像?...,使用||是不合适的,因为JavaScript解释器把0转换为假而不是真,这句话可能会一直跑到500,而且永远不会是0 使用??...(null) 可以看到我们用null作为参数时,打印出来直接就没有属性,这意味着这个Object是完完全全空的,它没有在Object这里继承任何东西; 而如果我们要创建一个普通的空对象(常规定义方法是...指向Date本身 可以看到这里还有一个[[Prototype]],这玩意儿我们也展开,就会发现看起来有点熟悉是不是?...的区别,总结起来的两点是 __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性。

    39620

    JavaScript实用手册

    ECMAScript: 是欧洲计算机制造协会以第一版 JavaScript 为基础,指定的 JavaScript语言标准,只固定了 JS 语言的核心语法,简称 ES.3.1=>5=> 6=>7 (3)....垃圾回收 垃圾回收就是引擎会自动释放不再被任何变量引用的对象,浏览器中的垃圾回收器就是用于专门释放不再被使用的对象的小程序,它伴随主程序执行而执行,会自动回收不再使用的对象 每个对象都有一个引用计数器...count,记录该对象被几个变量引用着,每多一个变量引用对象 count 就+1,每当一个变量不再引用该对象时 count 就-1,垃圾回收器会定时检查每个变量的引用计数器,如果对象的引用计数器为 0,...Object Global(在浏览器中被 window 代替) 原始类型的值本身不具有任何功能,如果要对原始类型的值做操作,必须有其他工具的辅助,包装类型专门用于封装原始类型的值,并提供操作原始类型值的...优点: 不会被声明提前 本质: 函数是一个引用类型的对象,函数名只是一个引用函数对象的普通变量 (3).

    3.4K10

    《你不知道的js(上卷)》笔记2(this和对象原型)

    this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。 调用位置 函数被调用的位置。...实际上,它们甚至都不能说是一种特殊的函数类型,它们只是被 new 操作符调用的普通函数而已。 使用new来调用函数,或者说发生构造函数调用时,会自动执行下面的操作。...propertyIsEnumerable(..)会检查给定的属性名是否直接存在于对象中(而不是在原型链 上)并且满足enumerable:true。...原型 JavaScript中的对象有一个特殊的 [[Prototype]] 内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时 [[Prototype]] 属性都会被赋予一个非空的值。...函数本身并不是构造函数,然而,当你在普通的函数调用前面加上new关键字之后,就会把这个函数调用变成一个“构造函数 调用”。实际上,new会劫持所有普通函数并用构造对象的形式来调用它。

    70310

    大话 JavaScript(Speaking JavaScript):第十六章到第二十章

    这是最常见的属性类型。 访问器(或命名访问器属性) 特殊方法的调用看起来像是读取或写入属性。普通属性是属性值的存储位置;访问器允许您计算属性的值。如果你愿意,它们是虚拟属性。...让我们首先检查普通对象,然后找出为什么无原型对象是更好的映射。 普通对象 通常,您在 JavaScript 中创建的每个对象至少都有Object.prototype在其原型链中。...但实际上它返回一个长度为 2 的空数组(它只包含两个空洞)。这是因为Array()将单个数字解释为数组长度,而不是数组元素。...[^«charSpecs»]匹配任何不匹配charSpecs中任何一个的单个字符。 以下构造都是字符规范: 源字符匹配它们自己。大多数字符都是源字符(甚至许多在其他地方是特殊的字符)。...与先行断言类似,模式用于检查输入中当前位置的某些内容,但在其他情况下被忽略。与先行断言相反,模式的匹配必须结束在当前位置(而不是从当前位置开始)。

    40420

    趣图:会 JS 了不起啊!

    这个能让知道你在面对问题的时候,你是否思考了其他的问题,想得越多,知道能体现出的思维比较发散,遇到问题可以有其他方式解决,而不是死磕一棵树上。...这样我们可以确保只测试组件,单元,而不是几个级别的子组件。 在我们的测试中,我们将触发组件上的操作,并检查组件的行为是否与预期一致。 我们不用盯着代码。...这突出了测试普通手机设备(如 Moto G4)的重要性而不仅仅是你口袋里的手机设备. 然而, 上下文关系也很重要: 优化网站用户的硬件设备和网络环境. ?...类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为...== null; //true, 类型不相同 4、总结 用一句话总结两者的区别就是:undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态

    2.5K33

    【C++修行之道】类和对象(四)运算符重载

    一、 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义 作为类成员函数重载时...,而不是执行这个函数”。...函数中首先检查自赋值的情况(即确保赋值操作的左右两边不是同一个对象),然后复制右边的对象的年、月和日到左边的对象,并返回左边对象的引用,以支持连续赋值操作。...有没有办法不生成拷贝?

    10110

    经典Java面试题收集

    默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。...补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。...,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象。...(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运行效率) 强类型变量和弱类型变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的...,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。

    1.5K130
    领券