JS:未定义值和未定义类型,以及null值和null类型之间的区别
JS: Distinctions between undefined value and Undefined type, as well as null value and Null type?
有人能解释未定义值和未定义类型之间的区别吗?类似地,null值和null类型也是如此?
额外的好处:为什么布尔值、字符串和数字有值、类型和对象,而null和undefined只有值和类型(没有对象)?如果"一切都是一个对象",那么人们会假设我们有所有可用值的对象,是吗?我的Infinity和NaN对象在哪里?
null
和undefined
是值。巧合的是(或者只是明智的选择),它们的类型分别是null
和undefined
,如规范中定义的null
值/类型,undefined
值/类型。这也可以通过使用typeof
运算符来显示:
typeof undefined; // "undefined"
typeof null ; // "null" (in ES6) and "object" in <=ES5 (bug)
一个值与一个类型相关联,该类型表示一个值的"种类"。
回答"值和类型之间的区别是什么?":
将类型视为某种类别,而值是该类别中的具体实例。
例如,我们的类型为String
,具体值为"foo"
。String
类型可以有许多不同的值,但Null
和Undefined
类型只有一个可能的值,分别是null
和undefined
。
规范的第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值
null
和undefined
的情况类似,尽管它们没有等价的对象。为什么?为此,你必须询问那些定义这种语言的人;)
如果"一切都是一个对象",那么人们会假设我们有所有可用值的对象,是吗?
一个更正确的说法是"几乎所有东西都是对象",基元值显然不是对象,但它们中的大多数都有一个等价的对象(实际上不应该使用),对于其他值,我们不在乎。事实上,JavaScript主要是面向对象的。
我的Infinity和NaN对象在哪里?
Infinity
和NaN
是类型为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
是一种类型,它只是语言的一部分。
- 未捕获的类型错误:无法读取属性'删除'的未定义
- 看到“;未捕获的类型错误:无法读取属性'weight'未定义的“;尽管按照字面上的指示
- "日期“;AJAX请求返回的类型值未定义
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- 类型错误:url未定义extjs 4正在填充组合框
- React.createElement:类型不应为null或未定义
- 未捕获的类型错误:无法读取属性'中止'的未定义
- Javascript 类型未定义和 void 之间的区别
- 类型错误'未定义'不是对象(正在评估'navigator.connection.type'
- 未捕获的类型错误:无法设置属性'背景'的未定义
- Javascript未捕获类型错误:无法读取属性'0'的未定义
- jQuery结合了2个绑定函数(类型错误:a是未定义的)
- 未捕获的类型错误: 无法读取未定义的属性“图像”
- 未定义类型的数据没有值
- JS:未定义值和未定义类型,以及null值和null类型之间的区别
- 高级闭包兼容性和静态类型 - 使用未定义类型和全局函数,如localStorage.getItem();
- 未初始化的 var 不应该总是未定义类型
- 无法读取属性'DATA_URL'的未定义类型file:///android_asset/www/apis
- 在chrome中无法读取未定义类型错误的属性套接字.套接字API
- 如何证明未定义类型只有一个值