在 JavaScript 中为什么 typeof null 的结果是 object?为什么呢?
2017-11-28 20:50
609 查看
javascript 中的
而
会抛出异常:
这是一个历史遗留下来的 feature(or bug?),The history of “typeof null”
在 javascript 的最初版本中,使用的 32 位系统,为了性能考虑使用低位存储了变量的类型信息:
000:对象
1:整数
010:浮点数
100:字符串
110:布尔
有 2 个值比较特殊:
-2^{30} (−2^30)表示。
在第一版的 javascript 实现中,判断类型的代
11221
码是这么写的:
javascript
(1):判断是否为 undefined
(2):如果不是 undefined,判断是否为对象
(3):如果不是对象,判断是否为数字
(4):。。。
这样一来,
被判断成了一个对象。这就是为什么
的返回值是
关于
在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让
终于不再是一个 bug,而是一个 feature,并且永远不会被修复。
null:既是对象,又不是对象,史称「薛定谔的对象」。
typeof null === 'object';
null instanceof Object === false
而
null instanceof null
会抛出异常:
Uncaught TypeError: Right-hand side of 'instanceof' is not an object
这是一个历史遗留下来的 feature(or bug?),The history of “typeof null”
在 javascript 的最初版本中,使用的 32 位系统,为了性能考虑使用低位存储了变量的类型信息:
000:对象
1:整数
010:浮点数
100:字符串
110:布尔
有 2 个值比较特殊:
undefined:用
-2^{30} (−2^30)表示。
null:对应机器码的
NULL指针,一般是全零。
在第一版的 javascript 实现中,判断类型的代
11221
码是这么写的:
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;
}
javascript
(1):判断是否为 undefined
(2):如果不是 undefined,判断是否为对象
(3):如果不是对象,判断是否为数字
(4):。。。
这样一来,
null就出了一个 bug。根据 type tags 信息,低位是
000,因此
null
被判断成了一个对象。这就是为什么
typeofnull
的返回值是
"object"。
关于
null的类型在 MDN 文档中也有简单的描述:typeof - javascript | MDN
在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让
typeofnull==='null'http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null 但是该提议被无情的否决了,自此
typeofnull
终于不再是一个 bug,而是一个 feature,并且永远不会被修复。
相关文章推荐
- 在 JavaScript 中为什么 typeof null 的结果是 object?
- How do I get the name of an object's type in JavaScript
- javascript 中为什么要用typeof x ===‘undefined’
- Javascript中数据类型及其判别方法(typeof instanceof Object.prototype.toSting.call(obj)的区别)
- Javascript高级程序设计——3.数据类型(1)typeof、null、undefined、boolean、number
- typeof升级版,可以识别出array、object、null、nan、[]、{}
- javascript:第四章数据类型:typeof number,Function,boolean,string,object,
- JavaScript:Uncaught TypeError Cannot read property 'id' of null。
- The usage of the Javascript method call and apply(what is the new and object.create difference.)(What does call(null) mean?)
- JavaScript typeof obj === ‘object’ 这样写有什么问题
- 为什么JavaScript里面typeof(null)的值是"object"?
- Java mail包出现"MimeMessage contains object of type javax.mail.util.SharedByteArrayInputStream instead of MimeMultipart"错误的修正办法
- org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type sette
- 把script放在head里出现Uncaught TypeError: Cannot set property 'scrollTop' of null(…)
- Null value was assigned to a property of primitive type setter of
- TypeError: 'bases' is null or not an object。IE8 bug 腐朽的对象
- 解决方法:Unable to cast COM object of type 'Shell32.ShellClass' to interface 'Shell32.IShellDispatch5'
- javascript typeof的用法
- Null value was assigned to a property of primitive type setter
- cannot pass non-trivial object of type 'string' to variadic function