24

根据http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf,JavaScript 有 6 种类型:undefinednullbooleanstring和.numberobject

var und;
console.log(typeof und); // <-- undefined

var n = null;
console.log(typeof n); // <--- **object**!

var b = true;
console.log(typeof b); // <-- boolean

var str = "myString"
console.log(typeof str); // <-- string

var int = 10;
console.log(typeof int); // <-- number

var obj = {}
console.log(typeof obj); // <-- object

问题一:

为什么类型是 nullobject而不是null

问题2:

函数呢?

var f = function() {};
console.log(typeof f); // <-- function

变量f的类型为function. 为什么规范中没有将其指定为单独的类型?

谢谢,

4

7 回答 7

13

关于typeof null == 'object',这是从早期就出现的错误,不幸的是这个错误会伴随我们很长时间,在ECMAScript 第 5版规范中修复已经太晚了。

关于函数,它们只是对象,但它们有一个名为的特殊内部属性[[Call]],在调用函数时在内部使用。

运算符仅通过typeof检查对象是否具有此内部属性来区分普通对象和函数。

于 2010-03-25T18:58:25.763 回答
5

这是因为如果输入为 ,typeof则定义为返回“对象” null,如果输入是可调用的,则返回“函数”。(参见 11.4.3typeof操作员。)

我不知道为什么标准是这样定义的(Crockford 说这是错误的)。也许向后兼容。

于 2010-03-25T18:28:22.777 回答
0

对问题 1 的回答:

没有定义的属性是未定义的。null 是 Object 的原因是,属性可以在没有值的情况下存在,但仍然有定义。

于 2010-03-25T18:43:33.580 回答
0

typeof null === "object"因为规范是这么说的,但这是 JavaScript 第一个版本的错误。(正如 KennyTM 上面所说的)。

typeof f === "function"因为没有try/ catch,就没有其他可靠、万无一失的方法来确定某些东西是否可调用。使用f.constructor === Function 可能有效,但我认为不能保证如此。

于 2010-03-25T18:53:44.320 回答
0

为了完整起见,请注意当前检查类型信息的最佳实践方法是这样的:

var typeInfo = Object.prototype.toString.call(yourObject);

这会给你一个看起来像“[object Something]”的字符串,其中“Something”是一个类型名称。

于 2010-03-25T19:02:22.610 回答
0

null 是一个特殊值——它不是假的,它不是 0,也不是空字符串、NaN 或未定义。

null 是当您查找不存在的对象时得到的 - 不是对象的未定义属性,而是事物本身。

带有一个 textNode 的段落将为节点 nextSibling 返回 null,不匹配的正则表达式返回 null 而不是数组,依此类推。

也许它应该有自己的类型,但随后它开始成为某种东西,一种有类型的东西,而不是没有对象。

于 2010-03-25T19:17:59.067 回答
0

还有 Array.prototype 。

  • 对象.原型
  • Array.prototype
  • 函数原型
  • Number.prototype
  • String.prototype
  • Boolean.prototype

Crockford说不要使用:

  • 新号码()
  • 新字符串()
  • 新布尔值()
于 2011-05-10T13:45:38.593 回答