我正在阅读“专业Web开发者Javascript”第4章,它告诉我五种类型的原语是:未定义,null,布尔,数字和字符串。
如果null是一个原语,为什么typeof(null)返回“object”?
这是不是意味着null是通过引用传递的(我假设这里所有的对象都是通过引用传递的),因此使它不是一个原语?
我正在阅读“专业Web开发者Javascript”第4章,它告诉我五种类型的原语是:未定义,null,布尔,数字和字符串。
如果null是一个原语,为什么typeof(null)返回“object”?
这是不是意味着null是通过引用传递的(我假设这里所有的对象都是通过引用传递的),因此使它不是一个原语?
当前回答
++作者的答案是:
我认为现在修复typeof已经太迟了。typeof null的修改将破坏现有代码
太迟了。自从微软创建了自己的JavaScript引擎并复制了第一个引擎版本的所有功能和错误后,所有后续引擎都复制了这个错误,现在修复它已经为时已晚。
JS_TypeOfValue(JSContext *cx, jsval v)
{
JSType type = JSTYPE_VOID;
JSObject *obj;
JSObjectOps *ops;
JSClass *clasp;
CHECK_REQUEST(cx);
if (JSVAL_IS_VOID(v)) {
type = JSTYPE_VOID;
} else if (JSVAL_IS_OBJECT(v)) {
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)
: ops->call != 0)) {
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;
}
return type;
}
其他回答
++作者的答案是:
我认为现在修复typeof已经太迟了。typeof null的修改将破坏现有代码
太迟了。自从微软创建了自己的JavaScript引擎并复制了第一个引擎版本的所有功能和错误后,所有后续引擎都复制了这个错误,现在修复它已经为时已晚。
JS_TypeOfValue(JSContext *cx, jsval v)
{
JSType type = JSTYPE_VOID;
JSObject *obj;
JSObjectOps *ops;
JSClass *clasp;
CHECK_REQUEST(cx);
if (JSVAL_IS_VOID(v)) {
type = JSTYPE_VOID;
} else if (JSVAL_IS_OBJECT(v)) {
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)
: ops->call != 0)) {
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;
}
return type;
}
来自YDKJS这本书
这是JS中一个长期存在的错误,但它可能永远不会消失 待修复。Web上有太多的代码依赖于这个bug,因此 修复它会导致更多的bug !
如果null是一个原语,为什么typeof(null)返回“object”?
简而言之:它是ECMAScript中的bug,类型应该是null
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null
正如已经指出的,规范是这么说的。但是,由于JavaScript的实现早于ECMAScript规范的编写,并且该规范小心翼翼地没有纠正最初实现的缺点,因此仍然存在一个合理的问题,即为什么要以这种方式完成。道格拉斯·克罗克福德称这是一个错误。Kiro Risk认为这是有道理的:
这背后的原因是,与undefined相比,null在对象出现的地方经常被使用(现在仍然是)。换句话说,null通常用于表示对对象的空引用。当Brendan Eich创建JavaScript时,他遵循了同样的范式,返回“object”是有意义的(可以说)。事实上,ECMAScript规范将null定义为表示有意缺少任何对象值的原语值(ECMA-262, 11.4.11)。
在JavaScript中,null是“nothing”。它应该是不存在的东西。不幸的是,在JavaScript中,null的数据类型是一个对象。你可以认为typeof null是一个对象是JavaScript的错误。它应该是空的。