Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >object到底是什么类型

object到底是什么类型

作者头像
用户7293182
发布于 2022-01-06 05:51:06
发布于 2022-01-06 05:51:06
44000
代码可运行
举报
文章被收录于专栏:jQuery每日经典jQuery每日经典
运行总次数:0
代码可运行

JavaScript中怎么样判断一个对象到底是什么类型呢?

先给出jQuery的最终实现,之后分析

jQuery源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 var class2type = {}; 
 2     jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 
 3       function( i, name ) { 
 4         class2type[ "[object " + name + "]" ] = name.toLowerCase(); 
 5       } ); 
 
 6     function type( obj ) { 
 7       if ( obj == null ) { 
 8         return obj + ""; 
 9       }
10       return typeof obj === "object" || typeof obj === "function" ?
11         class2type[ toString.call(obj) ] || "object" :
12         typeof obj;
13     }

jQuery的API中有以下几个基于type的方法:

  1. isFunction(obj) 实现:return jQuery.type(obj) === "array";
  2. isArray(obj) 实现:Array.isArray || function( obj ) { return jQuery.type(obj) === "array";

也可以这样实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 function type(obj){
 2     return Object.prototype.toString.call(obj).slice(8,-1); 
 3  }

分析

所有的引用均来自于 JavaScript | MDN

获得对象类型的方法有四种:

1. typeof

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typeof operand

operand is an expression representing the object or primitive whose type is to be returned.

operand是一个表示object或原始数据类型的表达式

在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。由于 null 代表的是空指针(大多数平台下值为0x00),因此,null的类型标签也成为了0,typeof null就错误的返回了"object".

2. obj instanceof constructor

The instanceof operator tests whether an object has in its prototype chain the prototype property of a constructor.

instanceof运算符用来判断某个构造函数的prototype属性所指向的对象是否存在于另外一个要检测对象的原型链上。

需要注意的是,如果表达式 obj instanceof Foo 返回true,则并不意味着该表达式会永远返回ture,因为Foo.prototype属性的值有可能会改变,改变之后的值很有可能不存在于obj的原型链上,这时原表达式的值就会成为false。另外一种情况下,原表达式的值也会改变,就是改变对象obj的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的__proto__魔法属性是可以实现的。比如执行obj.__proto__ = {}之后obj instanceof Foo就会返回false了。

还有个问题是多frame或多window之间的交互

在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。比如,表达式 [] instanceof window.frames[0].Array 会返回false,因为 Array.prototype !== window.frames[0].Array.prototype,因此你必须使用 Array.isArray(myObj) 或者Object.prototype.toString.call(myObj) === "[object Array]"来判断myObj是否是数组。

3. Object.prototype.toString()

Every object has a toString() method that is automatically called when the object is to be represented as a text value or when an object is referred to in a manner in which a string is expected. By default, thetoString() method is inherited by every object descended from Object. If this method is not overridden in a custom object, toString() returns "[object type]", where type is the object type.

如果这个方法没有被这个对象自身或者更接近的上层原型上的同名方法覆盖(遮蔽),则调用该对象的toString()方法时会返回"[object type]"。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 jQuery每日经典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript·JavaScript 秘密花园
JavaScript 秘密花园由两位 Stack Overflow 用户伊沃·韦特泽尔(写作)和张易江(设计)完成,由三生石上翻译完成,内容短小精炼。这次温故知新,做一番总结。
数媒派
2022/12/01
7320
读 Zepto 源码之内部方法
数组方法 定义 var emptyArray = [] concat = emptyArray.concat filter = emptyArray.filter slice
对角另一面
2017/12/27
8730
我的 Web 前端面试经历——百度
面试是个漫长的过程,从海投到收获电话面试,一面、二面、三面,一个步骤出错那么后面就宣告终结。同时,面试过程中你也可能会遇到一些面试官的刁难,甚至部分面试官会说些比较打击你的话,但是大部分面试官都是很棒的!
李才哥
2019/07/10
6870
我的 Web 前端面试经历——百度
前端面试题1:Object.prototype.toString.call() 、instanceof 以及 Array.isArray()三种方法判别数组的优劣和区别
每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object type],其中 type 为对象的类型。但当除了 Object 类型的对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,所以我们需要使用call或者apply方法来改变toString方法的执行上下文
IT人一直在路上
2019/09/18
3.7K0
前端面试题1:Object.prototype.toString.call() 、instanceof 以及 Array.isArray()三种方法判别数组的优劣和区别
每日两题 T29
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
合一大师
2020/07/20
3640
每日两题 T29
JS框架设计之对象类型判断一种子模块
Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型。基础数据类型包括5种基本数据类型,分别是null,bool,undefined,number,string,也叫简单数据类型,object是复杂数据类型,其中Object,Array,Function属于引用类型(对象数据类型)。 基于这么多数据类型,所以JS就自带有类型判定的方法,typeof  用来检测基本数据类型,instanceof 用来检测对象数据类型,但是JS自带的这两套识别机制并不靠谱,所以产生了isXXX一系列来判断
郑小超.
2018/01/24
1.1K0
四月份面试题汇总(一)
每创建一个函数,函数上都有一个prototype的属性,他是一个对象。这个对象的作用就是当使用它创建实例的时候,这些实例都会共享原型上的属性和方法。 当我们访问对象中的某个属性时,如果这个对象内部不存在这个属性,那么他就会去__proto__里面去找这个属性,这个__proto__又会有自己的__proto__, 就这么一直找下去直到最后一个__proto__值为null。
yuezhongbao
2019/02/26
4110
原生JS | 数据类型检测,并没你想象的那么简单
HTML5学堂-码匠:看上去,JavaScript中的数据类型检测,并没有什么难度,但是……它包含了不少的知识,如果你只知道一个typeof的话,那很建议你读读这篇文章,加强一下~ 最近一个关系很不错的朋友在跳槽,面试一家大型知名互联网公司的时候,面试官问了一个看上去“超级”基础的问题:如何进行数据类型的检测啊? 面试官:能告诉我如何进行数据类型的检测吗? 码匠好友:typeof啊~ 面试官:还有吗? 码匠好友:instanceof 面试官:还有别的吗?你了解几种? 码匠好友:jQuery的isArray、
HTML5学堂
2018/03/13
1K0
JavaScript中的类型判断
类型判断在 web 开发中有非常广泛的应用,简单的有判断数字还是字符串,进阶一点的有判断数组还是对象,再进阶一点的有判断日期、正则、错误类型,再再进阶一点还有比如判断 plainObject、空对象、Window 对象等等。
ConardLi
2019/05/23
1.4K0
JavaScript类型判断:解密变量真实身份的神奇技巧
JavaScript是一门弱类型语言,变量的类型是在运行时动态确定的。因此,在处理复杂的代码逻辑时,对于变量的类型判断变得尤为重要。本文将介绍一些JavaScript中常用的类型判断技巧,帮助开发者更好地理解和处理不同类型的变量。
IT_陈寒
2023/12/14
1850
JavaScript类型判断:解密变量真实身份的神奇技巧
4种Javascript类型检测的方式
今天这篇文章,主要介绍了JavaScript中检测数据类型的4种方式。如果已经会了的可以当成复习,如果还不了解的话,可以认真看看,并加以运用。
winty
2022/04/08
8580
JavaScript数据类型判断
instanceof可以用来判断对象是否是某个类的实例。instanceof的实现原理出门左转查看手撕instanceof
闲花手札
2021/09/08
1.1K0
判断数组的方法,请分别介绍它们之间的区别和优劣
Object.prototype.toString.call(任意类型的值),返回一个字符串 '[object 类型]',这种方法对所有数据类型都能判断,即使是null或者undefined;
刘嘿哈
2022/10/25
3260
【JS】501- 一文学会判断变量是否为数组
通常我们可以使用 Object.prototype.toString 方法进行判断,详细可以查看《Object.prototype.toString() - MDN - Mozilla》。
pingan8787
2020/02/19
9700
接近完美地判断JS数据类型,可行吗
JS的变量与其他语言的变量有很大区别,因为其变量松散的本质,决定了变量只是在特定时间内用于保存特定值的一个名字而已,变量的值及其数据类型可在声明周期内改变。
JowayYoung
2020/04/01
1.9K0
接近完美地判断JS数据类型,可行吗
面试常考手写代码学习技巧总结
我们在面试的时候,经常会被面试官问到几个手写代码的问题。手写一个数组去重复,深拷贝,数组拍平等等。有些小伙伴面试之前准备了,但是在编写的时候还是会忘掉,本文总结了一个如何应对手写代码的大纲,前面是一些基础内容,但是也希望能帮助到你,都会就当复习一遍,嘿嘿。
coder_koala
2020/01/17
1.1K0
jQuery源码浅析
如果说php是世界上最好的语言,那么javascript无疑可以称为世界上最飘逸的语言,最近看了下jQuery的源码,实现了一个简陋的jQuery。我觉得要看懂jQuery整体结构,需要搞懂js作用域链,闭包,js prototype继承,关于闭包网络上的定义实在太多了,这里参照了js权威指南里的定义,感觉从js的角度好理解一点。
用户3094376
2018/09/12
1K0
JavaScript的数据类型及其检测
JavaScript有几种数据类型,如何检测数据类型?这是本文要讨论的话题,思维导图如下:
心莱科技雪雁
2019/06/15
7570
JavaScript的数据类型及其检测
【面试说】聊聊JavaScript中的数据类型
答:Javascript 中的数据类型包括原始类型和引用类型。其中原始类型包括 Null、Undefined、Boolean、Number、String、Symbol、BigInt。引用类型指的是 Object。
GopalFeng
2022/08/01
6050
【面试说】聊聊JavaScript中的数据类型
假如易立竞问你如何判断 JavaScript 中的数据类型?
我们习惯把对象称为引用类型,当然还有很多特殊的引用类型,比如 Function、Array、RegExp、Math、Date、Error、Set、Map、各种定型数组 TypedArray 等。
童欧巴
2021/06/25
5370
相关推荐
JavaScript·JavaScript 秘密花园
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验