instanceof和typeof的细节

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

  今天来捋一捋我们平日经常用的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 =<
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信