有人会解释未定义值和未定义类型之间的区别,同样对于空值和空类型也是如此吗?
奖励:为什么 boolean、string 和 number 都有值、类型和对象,而 null 和 undefined 只有值和类型(没有对象)?如果“一切都是对象”,那么人们会假设我们有所有可用值的对象,是吗?我的 Infinity 和 NaN 对象在哪里?
有人会解释未定义值和未定义类型之间的区别,同样对于空值和空类型也是如此吗?
奖励:为什么 boolean、string 和 number 都有值、类型和对象,而 null 和 undefined 只有值和类型(没有对象)?如果“一切都是对象”,那么人们会假设我们有所有可用值的对象,是吗?我的 Infinity 和 NaN 对象在哪里?
回答“值和类型之间有什么区别?”这个问题。:
将类型视为某种类别,而值是该类别中的具体实例。
例如,我们有类型String
,具体的值是"foo"
. type 可以有许多不同的值,但是和类型String
只有一个可能的值,分别是和。Null
Undefined
null
undefined
规范的第 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
对象。
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
是一种类型,它只是语言的一部分。