目录

  • 如何判断一个对象是否属于某个类
    • `typeof`
    • `instanceof`
    • `constructor`
    • `Object.prototype.toString.call()`

如何判断一个对象是否属于某个类

typeof

typeof对于判断除了null之外的基本类型是准确的,但无法判断nullobjectarray等类型。所以它只在区别对象和原始类型的时候才有用。

console.log(typeof 42);
// expected output: "number"console.log(typeof 'blubber');
// expected output: "string"console.log(typeof true);
// expected output: "boolean"console.log(typeof undeclaredVariable);
// expected output: "undefined"

instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

[] instanceof Array; //true
{} instanceof Object;//true
new Date() instanceof Date;//true
function Person(){};
new Person() instanceof Person; // true
[] instanceof Object; //true
new Date() instanceof Object;//true
new Person instanceof Object;//true

用一段伪代码来实现 instanceof函数

function instance_of(L, R) { //L 表示左表达式,R 表示右表达式 var O = R.prototype;   // 取 R 的显式原型 L = L.__proto__;  // 取 L 的隐式原型while (true) {if (L === null)return false;if (O === L)  // 当 O 显式原型 严格等于  L隐式原型 时,返回truereturn true;L = L.__proto__;}
}

但是instanceof有时候仍是不准确的,因为js万物皆对象,对象、数组的原型最后都指向对象,所以会出现以下情况:

console.log({} instanceof Object) // true
console.log([] instanceof Object) // true
console.log(new Date() instanceof Object) // true
// ···

constructor

可以通过constructor来判断数据的类型,但是除了null、undefined,因为他们不是由对象构建。

// 数字
var num = 1;
num.constructor
ƒ Number() { [native code] }// 布尔值
true.constructor
ƒ Boolean() { [native code] }// 字符串
"".constructor
ƒ String() { [native code] }// 函数
var func = function(){}
func.constructor
ƒ Function() { [native code] }// 数组
[].constructor
ƒ Array() { [native code] }// 对象
var obj = {}
obj.constructor
ƒ Object() { [native code] }

Object.prototype.toString.call()

这可以说是终极方法,可以精准判断所有的类型

var toString = Object.prototype.toString;toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]//Since JavaScript 1.8.5
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]

拓展:

实现深拷贝:

function deepClone(obj) {if (typeof obj !== 'object') return objif (obj == null) return nullif (obj instanceof Date) return new Date(obj)if (obj instanceof RegExp) return new RegExp(obj)let o = new obj.constructor() // 保留类的继承关系for (let key in obj) {o[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]}return o
}

面试题:如何判断一个对象是否属于某个类相关推荐

  1. java判断接口对象是哪个子类_Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例。...

    Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例. 更多相关问题 -Do you know a has just opened in our neighborh ...

  2. 如何判断一个对象是否属于某个类

    第一种方式,使用 instanceof 运算符来判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位 第二种方式,通过对象的 constructor 属性来判断,对象的 const ...

  3. Swift:如何判断一个对象是否是某个类(或其子类)的实例

    在OC中我们直接可以用如下方法即可 [objc] view plaincopy [obj  isKindOfClass:[obj class]]; 在Swift中,并没有 .class 属性或者方法, ...

  4. php判断对象属于哪个类,PHP instanceof:判断对象是否属于某个类

    使用 PHP 中的 instanceof 运算符,可以判断一个对象是否属于某一个类,语法格式如下: 对象名 instanceof 类名; [示例]使用 instanceof 判断一个对象是否属于某个类 ...

  5. jquery 判断一个对象是否存在

    jQuery 代码判断一个对象是否存在: ***********************错误*********************** if($("#id")){}else{} ...

  6. 一个对象的属性_【前端冷知识】如何判断一个对象的某个属性是可写的?

    这是一个咋一听好像很简单,但是实际上却没那么简单,而且是很有趣的问题. 我们先来看一下什么情况下一个对象的属性是可写的. "属性可写"这个概念并没有严谨的定义,我们这里先来规定一下 ...

  7. 七种垃圾收集器和垃圾回收、分代收集、GCROOTS相关概念、GC如何判断一个对象可以被回收

    文章目录 垃圾收集器概述 垃圾回收算法 1)标记-清除算法(Mark-Sweep)(DVM 使用的算法) 2)复制算法(Copying) 3)标记-整理算法(Mark-Compact) 4)分代收集( ...

  8. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  9. js判断一个对象是否为空

    判断一个对象是否为空的三种方法 1.通过JSON自带的.stringify方法来判断 2.最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数 ...

最新文章

  1. [转载]eclipse的远程调试功能配置
  2. servlet中的session不一定会被创建
  3. 10月份个人技术指标
  4. Linux终端怎么锁屏,自制Linux 终端 锁屏防窃助手
  5. nginx与php-fpm通讯方式
  6. 处理 Maven 项目名称红色感叹号的问题
  7. 【练习】使用事务控制语句
  8. python3新式类_python新式类和旧式类区别
  9. 图片像QQ有消息闪动的代码:
  10. 关于OpenCV的基本数据类型
  11. 【数据库系统设计】SQL语言实验
  12. 2.#技术|Python实现钉钉课程自动签到, opencv+threading+tkinter
  13. YOLOv5的详细使用教程,以及使用yolov5训练自己的数据集
  14. 原生微信小程序UI组件库
  15. *TEST 1 for NOIP
  16. caniuse npm安装
  17. 基于微信小程序的单词记忆系统(Java+SSM+MySQL)
  18. hansontable编辑器
  19. 纯电动汽车两档ATM变速箱simulink模型,模型实现了两档AMT换挡策略和换挡过程仿真
  20. 并发编程五:java并发线程池底层原理详解和源码分析

热门文章

  1. 机器学习/推荐系统/推荐系统算法工程师面试指导
  2. QT 操作 msword.olb
  3. bash中的export命令
  4. 4110.圣诞老人的礼物
  5. Unity中国成立:投后估值10亿美元 阿里米哈游及抖音是股东
  6. 度小满9.20测开笔试第二题——相似字符串
  7. 【C语言】-- 整型数据的存储
  8. [STL]set存储pair并自定义排序
  9. 【HTML 教程】网页元素的属性
  10. C++自学笔记——空闲时间写的代码