面试题:如何判断一个对象是否属于某个类
目录
- 如何判断一个对象是否属于某个类
- `typeof`
- `instanceof`
- `constructor`
- `Object.prototype.toString.call()`
如何判断一个对象是否属于某个类
typeof
typeof
对于判断除了null之外的基本类型是准确的,但无法判断null
、object
、array
等类型。所以它只在区别对象和原始类型的时候才有用。
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
}
面试题:如何判断一个对象是否属于某个类相关推荐
- java判断接口对象是哪个子类_Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例。...
Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例. 更多相关问题 -Do you know a has just opened in our neighborh ...
- 如何判断一个对象是否属于某个类
第一种方式,使用 instanceof 运算符来判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位 第二种方式,通过对象的 constructor 属性来判断,对象的 const ...
- Swift:如何判断一个对象是否是某个类(或其子类)的实例
在OC中我们直接可以用如下方法即可 [objc] view plaincopy [obj isKindOfClass:[obj class]]; 在Swift中,并没有 .class 属性或者方法, ...
- php判断对象属于哪个类,PHP instanceof:判断对象是否属于某个类
使用 PHP 中的 instanceof 运算符,可以判断一个对象是否属于某一个类,语法格式如下: 对象名 instanceof 类名; [示例]使用 instanceof 判断一个对象是否属于某个类 ...
- jquery 判断一个对象是否存在
jQuery 代码判断一个对象是否存在: ***********************错误*********************** if($("#id")){}else{} ...
- 一个对象的属性_【前端冷知识】如何判断一个对象的某个属性是可写的?
这是一个咋一听好像很简单,但是实际上却没那么简单,而且是很有趣的问题. 我们先来看一下什么情况下一个对象的属性是可写的. "属性可写"这个概念并没有严谨的定义,我们这里先来规定一下 ...
- 七种垃圾收集器和垃圾回收、分代收集、GCROOTS相关概念、GC如何判断一个对象可以被回收
文章目录 垃圾收集器概述 垃圾回收算法 1)标记-清除算法(Mark-Sweep)(DVM 使用的算法) 2)复制算法(Copying) 3)标记-整理算法(Mark-Compact) 4)分代收集( ...
- 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC
36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...
- js判断一个对象是否为空
判断一个对象是否为空的三种方法 1.通过JSON自带的.stringify方法来判断 2.最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数 ...
最新文章
- [转载]eclipse的远程调试功能配置
- servlet中的session不一定会被创建
- 10月份个人技术指标
- Linux终端怎么锁屏,自制Linux 终端 锁屏防窃助手
- nginx与php-fpm通讯方式
- 处理 Maven 项目名称红色感叹号的问题
- 【练习】使用事务控制语句
- python3新式类_python新式类和旧式类区别
- 图片像QQ有消息闪动的代码:
- 关于OpenCV的基本数据类型
- 【数据库系统设计】SQL语言实验
- 2.#技术|Python实现钉钉课程自动签到, opencv+threading+tkinter
- YOLOv5的详细使用教程,以及使用yolov5训练自己的数据集
- 原生微信小程序UI组件库
- *TEST 1 for NOIP
- caniuse npm安装
- 基于微信小程序的单词记忆系统(Java+SSM+MySQL)
- hansontable编辑器
- 纯电动汽车两档ATM变速箱simulink模型,模型实现了两档AMT换挡策略和换挡过程仿真
- 并发编程五:java并发线程池底层原理详解和源码分析