资讯专栏INFORMATION COLUMN

typeof和instanceof的区别

ghnor / 2618人阅读

摘要:运算符用来测试一个对象在其原型链中是否存在一个构造函数的属性。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。

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

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

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

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83570.html

相关文章

  • JS中typeofinstanceof区别

    摘要:中和常用来判断一个变量是否为空,或者是什么类型的。运算符返回一个用来表示表达式的数据类型的字符串。运算符用来测试一个对象在其原型链中是否存在一个构造函数的属性。检查原型链会找到同上 JavaScript 中typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的。但它们之间还是有区别的: typeof typeof 是一个一元运算,放在一个运算数之前,运算数...

    zhoutk 评论0 收藏0
  • typeof instanceOf区别

    摘要:如果左侧的对象是右侧类的实例,则返回而中对象的类是通过初始化它们的构造函数来定义的。其语法是操作符用来比较两个操作数的构造函数。 关于typeof typeof一元运算符,用来返回操作数类型的字符串。 typeof几乎不可能得到它们想要的结果。typeof只有一个实际应用场景,就是用来检测一个对象是否已经定义或者是否已经赋值。而这个应用却不是来检查对象的类型。 Value ...

    Aceyclee 评论0 收藏0
  • 【1】JavaScript 基础深入——数据类型深入理解与总结

    摘要:类型的实例首先要理解的含义是例子的意思,实际上是判断是否是的一个实例。 数据类型深入理解 数据类型分类 基本(值)类型(5种) String:任意字符串 Number:任意的数字 boolean:true/false null:null undefined:undefined 对象(引用)类型(3种) Object:任意对象 Array:一种特别的对象(数值下...

    since1986 评论0 收藏0
  • 【重温基础】instanceof运算符

    摘要:需要测试的函数构造函数即用运算符来检测是否存在参数的原型链。区别只能用来判断对象函数和数组,不能用来判断字符串和数字等用于判断一个表达式的原始值,返回一个字符串。一般返回结果有函数数组,对象。 最近开始在整理ES6/ES7/ES8/ES9的知识点(已经上传到 我的博客 上),碰到一些知识点是自己已经忘记(用得少的知识点),于是也重新复习了一遍。 这篇文章要复习的 instanc...

    jimhs 评论0 收藏0
  • 原型模式故事链(3)--JS数据类型、以及区别、区分、转化

    摘要:所以不论你妈妈是喊,狗蛋回家吃饭了,还是喊小明回家吃饭了,其实喊的都是你。当然的嘛狗蛋买了件新衣服,小明当然就有这件新衣服了。。。 上一章--原型链讲解:传送门:https://segmentfault.com/a/11... 在上一章讲解原型链时提到了:所有的引用类型都有一个_proto_属性,称之为隐式原型。那么引用类型是什么鬼? 尽量简单的讲解一下javascript中的数据类...

    stdying 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<