3

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

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

4

3 回答 3

3

null并且undefined是价值观。巧合的是(或只是一个明智的选择),它们的类型null分别undefined是规范中定义的null value / typeundefined value / type。这也可以通过使用typeof运算符来显示:

typeof undefined; // "undefined"
typeof null     ; // "null" (in ES6) and "object" in <=ES5 (bug)

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

于 2012-07-30T12:51:16.330 回答
3

回答“值和类型之间有什么区别?”这个问题。

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

例如,我们有类型String,具体的值是"foo". type 可以有许多不同的值,但是和类型String只有一个可能的值,分别是和。NullUndefinednullundefined

规范的第 4.3 节对 IMO 最有帮助。例如,您可以在此处找到有关字符串的信息以及值、类型和对象之间的区别。

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

注意:字符串值是字符串类型的成员。序列中的每个整数值通常代表一个 16 位的 UTF-16 文本单元。但是,ECMAScript 对这些值没有任何限制或要求,只是它们必须是 16 位无符号整数。

4.3.17 字符串类型
集合所有可能的字符串值。

4.3.18 String object
Object 类型的成员,它是标准内置String构造函数的一个实例。

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

null和类似undefined,尽管它们没有等价的对象。为什么?为此,您必须询问定义该语言的人;)

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

更正确的说法是“几乎一切都是对象”,原始值显然不是对象,但它们中的大多数都有一个等效的对象(实际上不应该使用),而对于其他我们不关心的。事实上,JavaScript 主要是面向对象的。

我的 Infinity 和 NaN 对象在哪里?

Infinity并且NaN是type的Number,因此您可以创建Number对象,如下所示:

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

但无论如何你很少使用Number对象。

于 2012-07-30T13:40:49.587 回答
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"

请注意,我prim使用加号运算符明确地将第二个片段转换为。当我们对这样一个“原始值”进行操作时,ECMAscript(或更准确地说,它的引擎)无论如何都会在内部将该值转换为其对象表示。所以你的观点实际上非常正确,“一切都是对象”。


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

'undefined' in window // true

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

于 2012-07-30T12:50:44.143 回答