为了账号安全,请及时绑定邮箱和手机立即绑定

instanceof和typeof的细节

标签:
JavaScript

  我骑着小毛驴,喝着大红牛哇,哩个啷格里格朗,别问我为什么这木开心,如果活着不是为了浪荡那将毫无意义

  今天来捋一捋我们平日经常用的instanceof和typeof的一些小问题

  typeof:

    typeof里面是由一个小坑的  我们今天着重来研究一下这个小坑

    假设现在问一个问题 typeof(null) 结果为啥  可能你会觉得他是null   或者是Object ,可能有的同学会说那当然是null了

    其实正确答案是Object,那你知道为什么结果是Object吗,看到这你可能觉得你怎么这木啰嗦,不是我啰嗦,是因为学习嘛,不刨根问底就没意思了

    下面我们来说说原因:因为在 JS 的最初版本中,使用的是 32 位系统,为了性能考虑使用低位存储了变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。                    虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让 typeof null === 'null',但是该提议被无情的否决了,自此 typeof null 终于不再是一个 bug,而是一个 feature,并且永远不会被修复。

    下面是我从网上找的第一版javascript 实现中,判断类型的代码是这么写的:

    能看懂就看看,看不懂也无所谓,反正我也看不懂

复制代码

if (JSVAL_IS_VOID(v)) {  // (1)
    type = JSTYPE_VOID;
} else if (JSVAL_IS_OBJECT(v)) {  // (2)
    obj = JSVAL_TO_OBJECT(v);    if (obj &&
        (ops = obj->map->ops,
            ops == &js_ObjectOps            ? (clasp = OBJ_GET_CLASS(cx, obj),
            clasp->call || clasp == &js_FunctionClass) // (3,4)
            : ops->call != 0)) {  // (3)
        type = JSTYPE_FUNCTION;
    } else {
        type = JSTYPE_OBJECT;
    }
} else if (JSVAL_IS_NUMBER(v)) {
    type = JSTYPE_NUMBER;
} else if (JSVAL_IS_STRING(v)) {
    type = JSTYPE_STRING;
} else if (JSVAL_IS_BOOLEAN(v)) {
    type = JSTYPE_BOOLEAN;
}

复制代码

    instanceof

      下面我们来说一说instanceof,今天我们着重来看一看实现原理

      instanceof的实现原理是通过判断对象的原型链中是不是能找到类型的 prototype

      下面我们自己来写一个类似于instanceof的函数

      

复制代码

function instanceof(left, right) {    // 获得类型的原型
    let prototype = right.prototype    // 获得对象的原型
    left = left.__proto__    // 判断对象的类型是否等于类型的原型
    while (true) {        if (left === null)            return false
        if (prototype === left)            return true
        left = left.__proto__
    }
}

复制代码

      这木无趣的文章你竟然能看到这里,说,是不是对我有意思?要是你是女孩子,请联系我好吧,我这代养十八至二十五周岁的适龄女孩子,什么你是男的,那看完抓紧时间gun,等我啥时候

  开始搞基了我再通知你

原文出处:https://www.cnblogs.com/suihang/p/9938345.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消