题
按照 http://www.ecma-international.org/publications/files/ecma-st/ecma-262.pdf,JavaScript有6种类型: undefined
, null
, boolean
, string
, number
和 object
.
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
, ,如果输入是可召唤的,则返回“函数”。 (请参阅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()