typeof 和 instanceof 的区别

instanceof

instanceof 运算符用来判断一个构造函数的 prototype 属性所指向的对象是否存在另外一个要检测对象的原型链上。通常来讲,使用 instanceof 就是判断一个实例是否属于某种类型。

语法

object instanceof constructor

// 参数:object(要检测的对象)contructor(某个构造函数)

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

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

另外,如果表达式 obj instanceof Foo 返回 true,则并不意味着该表达式会永远返回 true,因为 Foo.prototype 属性的值有可能会改变,改变之后的值很有可能不存在于 obj 的原型链上,这时原表达式的值就会成为 false。

另外一种情况下,原表达式的值也会改变,就是改变对象obj的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的__proto__魔法属性,是可以实现的。比如执行 obj.__proto__ = {} 之后,obj instanceof Foo就会返回 false了。

typeof

typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。
它返回值是一个字符串,该字符说明运算数的类型,typeof 返回值表示的是运算数的数据类型

下表总结了 typeof 可能的返回值。

typeof 与 instanceof 的相同点:

JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的。

typeof 和 instanceof 的区别

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

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

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

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

对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。

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]"

判断数组终极解决方案:

// 封装一个函数
function isArrayFn(obj) {
    // 浏览器支持则使用isArray()方法
    if (typeof Array.isArray === "function") {
        return Array.isArray(obj);
    } 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是否是数组。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值