instanceof到底是怎样判断引用数据类型的!

拖延症。。。。得治啊!(才开始慢慢总结秋招中遇到的问题)


问题是这样的:

判断JavaScript数据类型的方法:(好了,那也就写一下咯)

  1. 最常见的:typeof判断,但是它的缺陷是,返回的类型都是字符串形式
  1. typeof null ===object,
  2. 它不能判断Array类型,判断出的数组类型是Object。
  1. 在已知是对象类型时:instanceof

那么,问题也就来了,instanceof到底是怎样判断的。

  1. 根据对象的constructor判断:constructor
  1. constructor 属性返回对创建此对象的数组,函数的引用。
  1. Object.prototype.toString.call()==='[object Array]'来进行判断。通用,但是很麻烦。

instanceof到底是怎样判断引用类型的。

第一反应是继承,但是我貌似是想多了。
看一段代码:

function A(){}
let a = new A()
console.log(a instanceof A)//true

很明显instanceof就是在判断一个实例是否属于某种类型
当然也很明了,instanceof就可以判断继承关系中用来判断一个实例是否属于它的父类型。

function instance_of(L, R) {
    var O = R.prototype;// R的显示原型
    L = L.__proto__;// L的隐式原型
    while (true) {
        /* Object.prototype.__proto__ === null*/
        /* __proto__ 指向它的原型对象 */
        if (L === null) {
            return false
        }
        if (L === O) {
            return true
        }
        L = L.__proto__;
    }
}

所有 JavaScript 对象都有 proto 属性,但只有Object.prototype.proto 为 null,前提是没有在 Firefox 或者 Chrome 下修改过这个属性。这个属性指向它的原型对象。

ok,差不多了,我们继续。

推一下: Object instanceof Object

ObjectL = Object, ObjectR = Object;
O = ObjectR.prototype = Object.prototype
L = ObjectL.__proto__ = Function.prototype
// 第一次判断
O !== L
L = Function.prototype.__proto__ = Object.prototype// 循环查找 L 是否还有 __proto__
// 第二次判断
O === L// 返回 true

参考文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值