博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
typeof和instanceof的区别
阅读量:7035 次
发布时间:2019-06-28

本文共 1964 字,大约阅读时间需要 6 分钟。

instanceof

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
语法
object instanceof constructor
描述
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

clipboard.png

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

String和Date对象同时也属于Object类型

clipboard.png

typeof

typeof操作符返回一个字符串,指示未经计算的操作数的类型。

下表总结了 typeof 可能的返回值。有关类型和原语的更多信息,可查看 页面。

clipboard.png

typeof和instanceof的区别

typeof和instanceof都可以用来判断变量,它们的用法有很大区别

typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值

如果我们想要判断一个变量是否存在,可以使用typeof:(不能使用if(a) 若a未声明,则报错)

if(typeof a != 'undefined'){    //变量存在}

需要注意的是,instanceof只能用来判断对象和函数,不能用来判断字符串和数字等

typeof不能用于判断是否为数组,因为都会返回object,判断是否为数组可以用一下几个方法:

1、constructor属性

这个属性在我们使用js系统或者自己创建的对象的时候,会默认的加上,例如:

var arr = [1,2,3];  //创建一个数组对象arr.prototype.constructor = Array;  //这一句是系统默认加上的

所以我们就可以这样来判断:

var arr = [1,2,3,1]; arr.constructor === Array;   // true

2、instanceof

instanceof是检测对象的原型链是否指向构造函数的prototype对象的,所以我们也可以用它来判断:

arr instanceof Array;   // true

3、Array.isArray()

Array.isArray(arr)   // true

4、Object.prototype.toString.call()

instanceof是检测对象的原型链是否指向构造函数的prototype对象的,所以我们也可以用它来判断:

Object.prototype.toString.call(arr)    // "[object Array]"

判断数组终极解决方案:

var arr = [1,2,3]; function isArrayFn(obj){  //封装一个函数if (typeof Array.isArray === "function") { return Array.isArray(obj); //浏览器支持则使用isArray()方法}else{                     //否则使用toString方法return Object.prototype.toString.call(obj) === "[object Array]"; } } alert(isArrayFn(arr));// true

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是否是数组。

转载地址:http://eufal.baihongyu.com/

你可能感兴趣的文章
多级视频监控平台网络配置
查看>>
JavaScript判断语句
查看>>
图像处理之高斯模糊
查看>>
Centos 安装邮件发送报警软件 MSMTP+MUTT
查看>>
linux添加新硬盘、格式化以及自动挂载
查看>>
bzoj 1010: [HNOI2008]玩具装箱toy
查看>>
initWithImage和imageWithContentsOfFile的区别
查看>>
iOS 5 :一个UIPageViewController程序示例
查看>>
NSObject之一
查看>>
腾讯的微信小程序开发环境下常用快捷键汇总
查看>>
GeekBand 随笔分享(二)
查看>>
Spring AOP 知识点入门
查看>>
交换机端口安全
查看>>
Docker容器安装
查看>>
SpringMVC3.1.1+Spring3.1.1+Hibernate4+Velocity+EasyUI+ZTree实现RBAC基于角色的访问控制(一)...
查看>>
F5预测:移动支付已成主流
查看>>
solaris 10完全卸载cluster并重新安装
查看>>
小结:Windows Phone 7
查看>>
洛谷——P3905 道路重建
查看>>
我的友情链接
查看>>