博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
instanceof和typeof的细节
阅读量:4683 次
发布时间:2019-06-09

本文共 1832 字,大约阅读时间需要 6 分钟。

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

  今天来捋一捋我们平日经常用的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

你可能感兴趣的文章
flex中dragdrop不响应的原因
查看>>
.Net学习笔记----2015-07-08(基础复习和练习01)
查看>>
1#Two Sum(qsort用法)
查看>>
Spark 各个组件关系
查看>>
Android Studio之could not reserve enough space for object heap
查看>>
pass
查看>>
给自己网站配置 https,http2 ,gzip压缩
查看>>
Linux发展历程
查看>>
centos7.3下curl支持https协议
查看>>
ASPCMS 标签
查看>>
《C++ Primer 4th》读书笔记 第12章-类
查看>>
Mac下搭建Apache+PHP+MySql运行环境
查看>>
WCF消息传递
查看>>
测试准入准出标准
查看>>
区块链学习笔记01(基本介绍)
查看>>
[树形dp] 洛谷 P2634 聪聪可可
查看>>
The version of SQL Server in use does not support datatype 'datetime2' 解决办法
查看>>
JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)...
查看>>
DSAPI多功能组件编程应用-HTTP监听服务端与客户端_指令版
查看>>
Java中的ReentrantLock和synchronized两种锁定机制的对比
查看>>