按照 http://www.ecma-international.org/publications/files/ecma-st/ecma-262.pdf,JavaScript有6种类型: undefined, null, boolean, string, 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

问题1:

为什么类型为null object 代替 null?

问题2:

功能呢?

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

多变的 f 有类型 function. 。为什么在规范中不指定单独的类型?

谢谢,

有帮助吗?

解决方案

关于 typeof null == 'object', ,这是自早期以来就发生的一个错误,不幸的是,这个错误将与我们在一起很长时间,那是 为时已晚 固定在 ECMAScript 5th 版本规范。

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

typeof 操作员仅通过检查对象是否具有此内部属性来区分普通对象和功能。

其他提示

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

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

答案问题1:

当属性没有定义时,它是未定义的。 null是一个对象的原因是,可以存在属性,而没有值仍然具有定义。

typeof null === "object" 因为规格是这样说的,但这是第一个版本的JavaScript的错误。 (正如肯尼特(Kennytm)所说的那样)。

typeof f === "function" 因为,没有一个 try/catch, ,没有其他可靠的,万无一失的方式来确定某些东西是否可召唤。使用 f.constructor === Function 可能 工作,但我认为不能保证是这样。

有关完整性,请注意,当前检查类型信息的最佳实践方法就是这样:

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

这为您提供了一个看起来像“ [对象的东西)”的字符串,其中“某物”是一个类型名称。

null是一个特殊的值 - 它不是错误的,不是0,也不是空字符串,NAN或未定义。

当您寻找不是那里的对象时,您会得到的,而不是对象的不确定属性,而是事物本身。

一个带有一个文本节点的段落将返回null for nodes sextsibling,这是一个匹配的正则返回null而不是数组等等。

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

还有Array.protype。

  • Object.Prototype
  • array.protype
  • function.protype
  • Number.Prototype
  • String.Prototype
  • boolean.protype

克罗克福德 表示不使用:

  • 新号码()
  • 新字符串()
  • new boolean()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top