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

JS: Distinctions between undefined value and Undefined type, as well as null value and Null type?

本文关键字:未定义 类型 null 值和 区别 之间 JS 以及      更新时间:2024-05-17

有人能解释未定义值和未定义类型之间的区别吗?类似地,null值和null类型也是如此?

额外的好处:为什么布尔值、字符串和数字有值、类型和对象,而null和undefined只有值和类型(没有对象)?如果"一切都是一个对象",那么人们会假设我们有所有可用值的对象,是吗?我的Infinity和NaN对象在哪里?

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

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

一个值与一个类型相关联,该类型表示一个值的"种类"。

回答"值和类型之间的区别是什么?"

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

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

规范的第4.3节是最有用的IMO。例如,您可以在这里找到有关字符串以及值、类型和对象之间的差异的信息。

4.3.16字符串值
基元值,它是零个或多个16位无符号整数的有限有序序列。

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

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

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

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

nullundefined的情况类似,尽管它们没有等价的对象。为什么?为此,你必须询问那些定义这种语言的人;)

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

一个更正确的说法是"几乎所有东西都是对象",基元值显然不是对象,但它们中的大多数都有一个等价的对象(实际上不应该使用),对于其他值,我们不在乎。事实上,JavaScript主要是面向对象的。

我的Infinity和NaN对象在哪里?

InfinityNaN是类型为Number,因此您可以创建Number对象,如下所示:

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

但是您很少使用Number对象。

typeof null === "object"

只是为了排除这种可能性。CCD_ 25被视为一个对象。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。第二次我们对这样一个"基元值"进行操作时,ECMAscript(或者更准确地说,它的引擎)无论如何都会在内部将该值转换为其对象表示。所以你的观点实际上是非常正确的,"一切都是物体"。


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

'undefined' in window // true

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