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 = left.__proto__
}
}
这木无趣的文章你竟然能看到这里,说,是不是对我有意思?要是你是女孩子,请联系我好吧,我这代养十八至二十五周岁的适龄女孩子,什么你是男的,那看完抓紧时间gun,等我啥时候
开始搞基了我再通知你
instanceof和typeof的细节的更多相关文章
- JavaScript类型判断instanceof与typeof对比
经常有人会在JavaScript里写如下的方法: function checkType() { var s1 = 123; var s2 = "OK"; if (s1 instan ...
- JavaScript instanceof和typeof的区别
引用自: http://www.cnblogs.com/eoiioe/archive/2008/12/31/1366081.html instanceof和typeof都能用来判断一个变量是否为空 ...
- JavaScript高级程序设计(五): js的关键字instanceof和typeof使用
JavaScript中instanceof和typeof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: 一.typeof 1.含义:typeof返回一个表达式的数据类型的字符 ...
- JavaScript中instanceof与typeof运算符的用法及区别详细解析
JavaScript中的instanceof和typeof常被用来判断一个变量是什么类型的(实例),但它们的使用还是有区别的: typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typ ...
- JS中的instanceof和typeof,以及特殊引用类型
1.instanceof是用于测试对象类型,通常格式为:a instanceof b,返回true或falise,表示为对象a是否是类型b的实例. typeof则是用于测试基本类型,包括undefin ...
- JavaScript instanceof vs typeof
Use instanceof for custom typesvar ClassFirst = function () {};var ClassSecond = function () {};var ...
- indexOf、instanceOf、typeOf、valueOf详解
1.indexOf() 该方法用来返回某个指定的字符串值在字符串中首次出现的位置. 语法:indexOf(searchvalue,fromindex);两个参数,参数一表示查询的字符串值,参数二可选表 ...
- 每日学习心得:Js获取Checkboxlist所选值、instanceof 和typeof区别、为Array添加contains方法
2013-11-24 前言: 上周在工作中遇到了一些跟JS以及前台交互的问题,虽然算不上多么高深,但是在解决时也走了一些弯路,所以就总结一下. 1. JS获取checkboxList所选的值 这 ...
- javascript--- hasOwnProperty、instanceof 、typeof的区别
typeof 作用:用来判断变量的类型 返回值: string 只有以下几种:number.boolean.string.object.undefined.function[很容易漏掉这个] 形式: ...
随机推荐
- HttpClient Fluent API 高并发优化
apache的httpcomponents-client 4.2之后提供了一套易于使用的facade API称为Fluent API,对于一般使用场景来说,使用起来非常简便,且性能也有一定保证,因为其 ...
- code2
#include <unistd.h> #include <sys/syscall.h> #include <linux/kernel.h> #include &l ...
- react中使用阿里Viser图表
参考demo的codesandbox:https://codesandbox.io/s/kxxxx3w5kv 使用步骤: 1. 安装依赖 viser-react和@antv/data-set 2 ...
- maya2019卸载/安装失败/如何彻底卸载清除干净maya2019注册表和文件的方法
maya2019提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2019失败提示maya2019安装未完成,某些产品无法安装,也有时候想重新安装maya ...
- Javascript高级编程学习笔记(11)—— 垃圾回收机制
垃圾回收机制 垃圾回收机制,是保证脚本能长时间运行的重要机制 JS具有自动垃圾收集机制,也就是说执行环境会负责管理代码执行过程中使用的内存 与一些偏底层的语言(c.c++)不同,我们不需要手工地去管理 ...
- 和嗲妹妹面试python,是种什么体验?
这次给大家讲讲我2年前去爱奇艺面试高级运维开发岗位的经历,希望对大家带来一些帮助. 公众号「Python专栏」后台回复:自动化运维平台,获取整套自动化运维平台的源代码 聊骚阶段 嗲妹妹:你好,我是爱奇 ...
- canvas与webgl坐标转换
1 canvas的坐标系 坐标原点在左上角,横轴向右为X轴正方向,竖直向下为Y轴正方向 2 webgl的坐标系 坐标原点在绘图区域的中心点,横向右为X轴正方向,竖直向上为Y轴正方向,横纵坐标区域范围为 ...
- Xshell连接ESXI方法
第一步.ESXI打开ssh功能按住F2进入设置如下图: 第二步.输入密码 第三步.选择Troubleshooting Options 回车 第四步.选择Enable SSH 这里只介绍了一种方式打开E ...
- 关于JAVAweb的一些东西
1.Servlet 1.Servlet访问URL映射配置 <servlet> <servlet-name>ServletDemo1</servlet-name> & ...
- 图文教程 | 开启远程访问mysql数据库权限
!!!考虑到安全性,不建议使用 所以将指定用户的host改为:% 即可 执行:(以root用户为例) use mysql; update user set host = "%" ...