有人会解释未定义值和未定义类型之间的区别,对于空值和Null类型也是如此吗?
Bonus:为什么boolean,string和number有值,类型和对象,而null和undefined只有值和类型(没有对象)?如果“一切都是对象”,那么人们就会假设我们拥有所有可用值的对象,是吗?我的无限和NaN对象在哪里?
答案 0 :(得分:2)
null
和undefined
是值。巧合(或只是明智的选择),他们的类型分别是null
undefined
,如定义 null
value / type,{{1}规范中的value / type 。这也可以使用undefined
运算符显示:
typeof
值与类型相关联,表示值的“种类”。
答案 1 :(得分:2)
回答问题“值和类型有什么区别?”:
将类型视为某种类别,值是该类别中的具体实例
例如,我们的类型为String
,具体值为"foo"
。类型String
可以有许多不同的值,但Null
和Undefined
类型只有一个可能值,分别为null
和undefined
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值。
null
和undefined
类似,但它们没有等效对象。为什么?为此,你必须问那些定义该语言的人;)
如果“一切都是对象”,那么可以假设我们有所有可用值的对象,是吗?
更正确的陈述是“几乎所有东西都是对象”,原始值显然不是对象,但大多数它们具有等价的对象(实际应该是不被使用)和其他我们不在乎。事实上,JavaScript主要是面向对象的。
我的Infinity和NaN对象在哪里?
Infinity
和NaN
是Number
类型的值,因此您可以创建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
是一种类型,它只是语言的一部分。