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 返回一个代表该对象的字符串
用法不多说了,直接上代码
由于个人能力有限,如果有错误希望大家帮我及时改正。