时间:2021-07-01 10:21:17 帮助过:4人阅读
1、一元运算符 typeOf
2、关系运算符 instanceof
3、constructor 属性
4、prototype属性
一、typeof
typeof的返回值有以下几种
类型 | 结构 |
---|---|
Undefined | "undefined" |
Null | "object" (见下方) |
布尔值 | "boolean" |
数值 | "number" |
字符串 | "string" |
Symbol (ECMAScript 6 新增) | "symbol" |
宿主对象(JS环境提供的,比如浏览器) | Implementation-dependent |
函数对象 (implements [[Call]] in ECMA-262 terms) | "function" |
任何其他对象 | "object" |
简单粗暴的方法,直接看代码
typeof 只能检查出来以上7几种类型
二、instanceof
instanceof 运算符用于识别正在处理的对象的类型,要求开发者明确地确认对象为某特定类型
1、instanceof 和 constructor 没有关系
2、instanceof又叫关系运算符,可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上
第三次输出为什么会返回false呢 ?原文地址:Javascript中一个关于instanceof的问题
再看一个复杂的用法
为什么,这是为什么呢,要搞明白以下含义
1、语言规范中是如何定义这个运算符的
2、JavaScript 原型继承机制
Object instanceof Object
Function instanceof Function
instanceof 在 Dojo 继承机制中的应用
在 JavaScript 中,是没有多重继承这个概念的,就像 Java 一样。但在 Dojo 中使用 declare 声明类时,是允许继承自多个类的
instanceof和多全局对象(多个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是否是数组。
注意:undefined和null是检测的Object类型,因为js中没有Undefined和Null的这种全局类型,number, string和boolean无法检测出它的类型
三、constructor
在使用instanceof检测变量类型时,我们是检测不到number, 'string', bool的类型的。因此,我们需要换一种方式来解决这个问题
Object.prototype.constructor返回一个指向创建了该对象原型的函数引用。需要注意的是,该属性的值是那个函数本身,而不是一个包含函数名称的字符串。对于原始值(如1,true 或 "test"),该属性为只读,所有对象都会从它的原型上继承一个 constructor 属性
constructor本来是原型对象上的属性,指向构造函数。但是根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor属性的
不过要注意,constructor属性是可以被修改的,会导致检测出的结果不正确
改变这个对象的constructor属性的值
除了undefined和null,其他类型的变量均能使用constructor判断出类型
四、万能的Object.prototype.toString.call
使用toString()方法来检测对象类型
附上判断函数 Javascript中的数据类型知多少
五、jquery的实现 jquery: "1.8.2",
jquery中提供了一个$.type的接口,看看代码
可以看出来,jquery中就是用Object.prototype.toString.call实现的