返回 登录
0

JavaScript中对象类型检测

ECMAScirpt中有两种数据类型的值:基本数据类型和引用数据类型

  • 基本数据类型: 简单的数据段 存放在栈中 按值访问
  • 基本数据类型如下:Undefined Null Boolean Number String
  • 引用数据类型:由多个值构成的对象 存放在堆中 按地址访问
  • 引用数据类型如下:Object Array Function 等

以上内容是大家众所周知的,那该如何检测某个变量属于那种类型?以下是我知道的几种方法

1、typeof
它只能检测基本数据类型,对引用类型束手无策

图片描述

2、instanceof
概述:instanceof 运算符可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上
语法:object instanceof constructor

图片描述
因为所有的实例都继承自Object, 所以object instanceof Object 返回皆为true

图片描述

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

图片描述

图片描述

3、constructor
通过 obj.constructor 得到某个实例到对应的构造函数
在修改了构造函数(A)原型链且没有显式的修改A.prototype.constructor的情况下,结果将不是我们想要的

图片描述

4、{}.toString || Object.prototype.toString 返回一个代表该对象的字符串

用法不多说了,直接上代码

图片描述

由于个人能力有限,如果有错误希望大家帮我及时改正。

评论