JS:未定义值和未定义类型之间的区别,以及空值和Null类型?

时间:2012-07-30 12:40:08

标签: javascript ecmascript-5

有人会解释未定义值和未定义类型之间的区别,对于空值和Null类型也是如此吗?

Bonus:为什么boolean,string和number有值,类型和对象,而null和undefined只有值和类型(没有对象)?如果“一切都是对象”,那么人们就会假设我们拥有所有可用值的对象,是吗?我的无限和NaN对象在哪里?

3 个答案:

答案 0 :(得分:2)

nullundefined是值。巧合(或只是明智的选择),他们的类型分别是null undefined,如定义 null value / type,{{1}规范中的value / type 。这也可以使用undefined运算符显示:

typeof

值与类型相关联,表示值的“种类”。

答案 1 :(得分:2)

回答问题“值和类型有什么区别?”

类型视为某种类别是该类别中的具体实例

例如,我们的类型为String,具体值为"foo"。类型String可以有许多不同的值,但NullUndefined类型只有一个可能值,分别为nullundefined

Section 4.3 of the specification是最有帮助的IMO。在这里,您可以找到有关字符串的信息以及值,类型和对象之间的区别。

  

4.3.16字符串值
  原始值,它是零或更多16位无符号整数的有限有序序列。

     

注意:String值是String类型的成员。序列中的每个整数值通常表示单个16位UTF-16文本单元。但是,ECMAScript不会对值赋予任何限制或要求,除非它们必须是16位无符号整数。

     

4.3.17字符串类型
  设置所有可能的String值的

     

4.3.18字符串对象
   Object类型的成员,它是标准内置String构造函数的实例。

     

注意:通过在新表达式中使用String构造函数创建String对象,并提供String值作为参数。生成的对象具有内部属性,其值为String值。通过将String构造函数作为函数调用(15.5.1),可以将String对象强制转换为String值。

nullundefined类似,但它们没有等效对象。为什么?为此,你必须问那些定义该语言的人;)

  

如果“一切都是对象”,那么可以假设我们有所有可用值的对象,是吗?

更正确的陈述是“几乎所有东西都是对象”,原始值显然不是对象,但大多数它们具有等价的对象(实际应该是不被使用)和其他我们不在乎。事实上,JavaScript主要是面向对象的。

  

我的Infinity和NaN对象在哪里?

InfinityNaNNumber类型的,因此您可以创建Number个对象,如下所示:

new Number(1/0) // Infinity
new Number("a") // NaN

但是你很少使用Number个对象。

答案 2 :(得分:0)

typeof null === "object"

只是为了排除这一点。 null被视为对象。并非ECMAscript中的所有内容都是对象。 “另一面”就是所谓的“原始价值”。简单地说,原始值是普通值,它们不是由任何 Object构造函数创建的。例如:

var prim = 23;

prim.foo = true;
console.log( 'prim is: ', prim, 'prim.foo is: ', prim.foo );  // "prim is 23, prim.foo is: undefined"

另一方面

var prim = new Number(23);

prim.foo = true;
console.log( 'prim is: ', +prim, 'prim.foo is: ', prim.foo );  // "prim is 23, prim.foo is: true"

请注意,我使用plus运算符在第二个代码段上明确地投射prim。第二个是我们对这样一个“原始值”进行操作,ECMAscript(或更准确地说,它的引擎)无论如何都会在内部将该值转换为 Object representation 。所以你指出实际上非常正确,“一切都是对象”。


undefined是一个定义的值(即使听起来很愚蠢):

'undefined' in window // true

null是一种类型,它只是语言的一部分。