java 中的 null:既是对象,又不是对象,史称「薛定谔的对象」。

  1. typeof null==='object';  、、//true

  2. null instanceof Object    //false

  3. nullinstanceofObject===false

  1. null instanceof null

会抛出异常:

  1. UncaughtTypeError:Right-hand side of 'instanceof'isnotan object

这是一个历史遗留下来的 feature(or bug?),The history of “typeof null”

在 java 的最初版本中,使用的 32 位系统,为了性能考虑使用低位存储了变量的类型信息:

  • 000:对象

  • 1:整数

  • 010:浮点数

  • 100:字符串

  • 110:布尔

有 2 个值比较特殊:

  • undefined:用 -2^{30} (−2^30)表示。

  • null:对应机器码的 NULL指针,一般是全零。

在第一版的 java 实现中,判断类型的代码是这么写的:

  1. if(JSVAL_IS_VOID(v)){// (1)

  2. type =JSTYPE_VOID;

  3. }elseif(JSVAL_IS_OBJECT(v)){// (2)

  4. obj =JSVAL_TO_OBJECT(v);

  5. if(obj &&

  6. (ops =obj->map->ops,

  7. ops ==&js_ObjectOps

  8. ?(clasp =OBJ_GET_CLASS(cx,obj),

  9. clasp->call ||clasp ==&js_FunctionClass)// (3,4)

  10. :ops->call !=0)){// (3)

  11. type =JSTYPE_FUNCTION;

  12. }else{

  13. type =JSTYPE_OBJECT;

  14. }

  15. }elseif(JSVAL_IS_NUMBER(v)){

  16. type =JSTYPE_NUMBER;

  17. }elseif(JSVAL_IS_STRING(v)){

  18. type =JSTYPE_STRING;

  19. }elseif(JSVAL_IS_BOOLEAN(v)){

  20. type =JSTYPE_BOOLEAN;

  21. }

java

(1):判断是否为 undefined

(2):如果不是 undefined,判断是否为对象

(3):如果不是对象,判断是否为数字

(4):。。。

这样一来, null就出了一个 bug。根据 type tags 信息,低位是 000,因此 null被判断成了一个对象。这就是为什么 typeofnull的返回值是 "object"。

关于 null的类型在 MDN 文档中也有简单的描述:typeof - java | MDN

在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让 typeofnull==='null'http://wiki.ecma.org/doku.php?id=harmony:typeof_null 但是该提议被无情的否决了,自此 typeofnull终于不再是一个 bug,而是一个 feature,并且永远不会被修复。返回搜狐,查看更多

在 JavaScript 中为什么 typeof null 的结果是 object?的更多相关文章

  1. JavaScript中的 typeof,null,和undefined

    typeof操作符 null 在JavaScript中null表示“什么都没有”. null是一个只有一个值的特殊类型.表示一个空对象引用. typeof null; 返回的是object 可以将nu ...

  2. 浅析JavaScript中的typeof运算符

    对JavaScript中的typeof运算符进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 如果typeof的运算符是数字.字符串或者布尔值,它返回的结果就是"numb ...

  3. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断

    C#保留2位小数几种场景总结   场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...

  4. null与对象的复杂关系(typeof null的结果是object的原因)

    原文 简书原文:https://www.jianshu.com/p/c1608452d056 前言 对象是 JavaScript 的基础.在 JavaScript 中一共有六种主要类型(术语是“语言类 ...

  5. javascript中的undefined,null,"",0和false的云集

    在各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBNull,bool ...

  6. javascript中的typeof和类型判断

    typeof ECMAScript 有 5 种原始类型(primitive type),即 Undefined.Null.Boolean.Number 和 String.我们都知道可以使用typeof ...

  7. JavaScript中的typeof

    js中的 typeof 操作符返回一个字符串,表示未经计算的操作数的类型. 其中null.字符串对象.数字对象.布尔对象.日期.数组.正则返回结果都为object,可见typeof返回结果并不精确 测 ...

  8. JavaScript中的Undefined / Null 类型相关说明

    1,综述: ※Undefined 和 Null是JavaScript中的两种数据类型(其他的类型还有:Boolean, String, Number, Object). ※Undefined类型只有一 ...

  9. 关于JavaScript中的typeof与instanceof

    JavaScript中typeof和instanceof可以用来判断一个数据的类型,什么时候选择使用typeof?什么时候选择使用instanceof? typeof运算符 typeof运算符返回值有 ...

随机推荐

  1. 【Thread】java线程之对象锁、类锁、线程安全

    说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...

  2. sqlserver中判断是数字(会自动将.3识别为0.3)

    SQL Server 检测是不是数字型的数据(两种方法) 检测是不是数字型的数据, 两种方法 1. ISNUMERIC ( expression ) 2. PATINDEX ( '%pattern%' ...

  3. 字符串积累ing

    明天就要上网课拉拉啦啦! 数据库先在手机端登录然后转战客户端试之! 操作系统在客户端登录试一试! 马原用学习通试试啦! 首先,介绍一下strlen,strcpy,strcmp函数! 参考:https: ...

  4. STL中_Rb_tree的探索

    我们知道STL中我们常用的set与multiset和map与multimap都是基于红黑树.本文介绍了它们的在STL中的底层数据结构_Rb_tree的直接用法与部分函数.难点主要是_Rb_tree的各 ...

  5. ACM-ICPC 2018 焦作赛区网络预赛 Give Candies 题解

    ACM-ICPC 2018 焦作赛区网络预赛 Give Candies n个糖果分给n个小朋友 从1到n个小朋友依次给,每次随机给个数,至少一个,知道没有糖果为止. 问糖果的分布情况方案数. 输出方案 ...

  6. JQ input输入框回车生成标签,可删除,并获取标签的值

    在网上找的,效果如下 html代码 <!DOCTYPE html> <html lang="zh-CN"> <head> <title&g ...

  7. py 二级习题(turtle)

    用turtle画一个正方形 import turtle turtle.penup() turtle.goto(-100,-100) turtle.pendown() turtle.begin_fill ...

  8. [Python]jieba切词 添加字典 去除停用词、单字 python 2020.2.10

    源码如下: import jieba import io import re #jieba.load_userdict("E:/xinxi2.txt") patton=re.com ...

  9. Networking POJ - 1287 最小生成树板子题

    #include<iostream> #include<algorithm> using namespace std; const int N=1e5; struct edge ...

  10. 计算器程序编写_python

    一.计算一串字符串的最终值,相当于eval函数功能: #!/usr/bin/env python # _*_ coding:utf-8 _*_ #Author:chenxz import re def ...