【问题标题】:JS: Distinctions between undefined value and Undefined type, as well as null value and Null type?JS:未定义值和未定义类型,以及空值和空类型之间的区别?
【发布时间】:2012-07-28 03:18:52
【问题描述】:

有人能解释一下 undefined 值和 Undefined 类型之间的区别吗,同样对于 null 值和 Null 类型也是一样的?

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

【问题讨论】:

  • 一个是类型,另一个是值。我想没什么好解释的吧?
  • 我知道未定义的值是“未为变量赋值时使用的原始值”。我认为@Felix_Kling 击中了下面的头,“值和类型有什么区别”?我想这就是我不知道的。

标签: javascript ecmascript-5


【解决方案1】:

nullundefined 是值。巧合(或只是一个明智的选择),它们的类型分别是nullundefined,定义为nullvalue/type,undefinedvalue/type在规范中。这也可以通过使用typeof 运算符来显示:

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

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

【讨论】:

  • 那么值和类型有什么区别呢? (我知道你无法比较它们,但你并没有真正解释它们之间的关系)。
  • 请注意,typeof null 在 ES6 中仍然是 'object',根据 the spec
【解决方案2】:

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

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

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

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

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

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

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

4.3.18 字符串对象
Object 类型的成员,它是标准内置 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 对象。

【讨论】:

  • 早上好,菲利克斯,感谢您的回复。我仍然不清楚空值和空类型之间的区别。如何让 Javascript 控制台输出这些值?
  • 正如我所说,JavaScript 中有多种数据类型,例如字符串、数字等。现在,您认为 null 是哪种类型的?细绳?数字?如果是这样,为什么?它似乎不适合任何这些类型,这就是为什么它有自己的类型,Null 类型。他们也可以决定创建一个名为Special 的类型,其值为nullundefined,但他们没有。您不能列出类型及其值,因为某些类型(例如数字)具有无限数量的值。这也无关紧要,因为在代码中,您只能使用 values.
  • @Felix_Kling 该回复确实有助于澄清区别,非常感谢。我将在 JSMentors 上提出更多问题,以确保我真正理解这个概念,我将在此评论的编辑中发布链接。
  • 很高兴能帮上忙 :) 编码愉快!
【解决方案3】:

typeof null === "object"

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

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 投射到第二个 sn-p 上。第二次我们对这样一个“原始值”进行操作,ECMAscript(或更准确地说,它的引擎)无论如何都会在内部将该值转换为其 Object 表示。所以你的观点实际上非常正确,“一切都是对象”。


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

'undefined' in window // true

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

【讨论】:

  • 4.3.11 定义空值,4.3.12 定义空类型。您介意解释一下标准数字值在哪里转换为数字对象吗?我正在查看加号运算符和数字部分,但找不到。感谢您抽出宝贵时间回复!
猜你喜欢
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2021-11-17
  • 2020-02-24
  • 2023-03-15
  • 1970-01-01
  • 2011-03-26
  • 2019-08-12
相关资源
最近更新 更多