我想知道JavaScript中null和undefined之间的区别。
当前回答
null是一个特殊值,表示“无值”。null是一个特殊的对象,因为typeof null返回“object”。
另一方面,undefined表示变量尚未声明,或未给定值。
其他回答
null和undefined是两种不同的对象类型,它们具有以下共同点:
两者都只能保存一个值,分别为null和undefined;两者都没有财产或方法,尝试读取其中一个的任何财产都会导致运行时错误(对于所有其他对象,如果尝试读取不存在的属性,则会得到未定义的值);通过==和!=,值null和undefined被视为彼此相等,其他值都不相等操作员。
然而,相似之处到此为止。这一次,在实现关键字null和undefined的方式上有一个根本的区别。这并不明显,但请考虑以下示例:
var undefined = "foo";
WScript.Echo(undefined); // This will print: foo
undefined、NaN和Infinity只是预初始化的“超级全局”变量的名称-它们在运行时被初始化,可以被具有相同名称的普通全局或局部变量覆盖。
现在,让我们对null做同样的尝试:
var null = "foo"; // This will cause a compile-time error
WScript.Echo(null);
哎呀!null、true和false是保留关键字-编译器不允许将它们用作变量或属性名称
另一个区别是undefined是一种基本类型,而null是一种对象类型(表示没有对象引用)。考虑以下事项:
WScript.Echo(typeof false); // Will print: boolean
WScript.Echo(typeof 0); // Will print: number
WScript.Echo(typeof ""); // Will print: string
WScript.Echo(typeof {}); // Will print: object
WScript.Echo(typeof undefined); // Will print: undefined
WScript.Echo(typeof null); // (!!!) Will print: object
此外,在数字上下文中处理null和undefined的方式也有一个重要的区别:
var a; // declared but uninitialized variables hold the value undefined
WScript.Echo(a === undefined); // Prints: -1
var b = null; // the value null must be explicitly assigned
WScript.Echo(b === null); // Prints: -1
WScript.Echo(a == b); // Prints: -1 (as expected)
WScript.Echo(a >= b); // Prints: 0 (WTF!?)
WScript.Echo(a >= a); // Prints: 0 (!!!???)
WScript.Echo(isNaN(a)); // Prints: -1 (a evaluates to NaN!)
WScript.Echo(1*a); // Prints: -1.#IND (in Echo output this means NaN)
WScript.Echo(b >= b); // Prints: -1 (as expected)
WScript.Echo(isNaN(b)); // Prints: 0 (b evaluates to a valid number)
WScript.Echo(1*b); // Prints: 0 (b evaluates to 0)
WScript.Echo(a >= 0 && a <= 0); // Prints: 0 (as expected)
WScript.Echo(a == 0); // Prints: 0 (as expected)
WScript.Echo(b >= 0 && b <= 0); // Prints: -1 (as expected)
WScript.Echo(b == 0); // Prints: 0 (!!!)
当在算术表达式或数字比较中使用null时,null变为0-与false类似,它基本上只是一种特殊的“零”。另一方面,undefined是一个真正的“无”,当您尝试在数字上下文中使用它时,它会变成NaN(“非数字”)。
注意,null和undefined从==和!=接收特殊处理运算符,但可以使用表达式(a>=b&&a<=b)测试a和b的真正数值相等性。
null是一个特殊值,表示“无值”。null是一个特殊的对象,因为typeof null返回“object”。
另一方面,undefined表示变量尚未声明,或未给定值。
tl;博士
使用null设置一个已知为Object的变量。
使用undefined设置类型混合的变量。
这是我对5个原语和Object类型的用法,这解释了未定义或空的«用例»之间的区别。
一串
如果您知道一个变量在整个生命周期中只是一个字符串,那么按照惯例,您可以将其初始化为“”:
("") ? true : false; // false
typeof ""; // "string";
("Hello World") ? true : false; // true
typeof "Hello World"; // "string"
数字
如果您知道一个变量在所有生命周期中都只是一个数字,那么按照惯例,您可以将其初始化为0(如果0在您的使用中是一个重要值,则为NaN):
(0) ? true : false; // false
typeof 0; // "number";
(16) ? true : false; // true
typeof 16; // "number"
or
(NaN) ? true : false; // false
typeof NaN; // "number";
(16) ? true : false; // true
typeof 16; // "number"
布尔型
如果您知道一个变量只是一个布尔值,而所有生命周期,按照惯例,您可以将其初始化为false:
(false) ? true : false; // false
typeof false; // "boolean";
(true) ? true : false; // true
typeof true; // "boolean"
对象
如果您知道一个变量在所有生命周期中都只是一个Object,那么按照惯例,您可以将其初始化为null:
(null) ? true : false; // false
typeof null; // "object";
({}) ? true : false; // true
typeof {}; // "object"
注意:关闭null的智能用法是Object的错误版本,因为Object始终为true,因为typeof null返回对象。这意味着typeof myVarObject返回Object和null类型的一致值。
All
如果您知道一个变量有一个混合类型(所有生命周期中的任何类型),按照惯例,您可以将其初始化为undefined。
由于typeof返回undefined,undefineed是一种类型,其中null是一个初始值设定项,表示变量指向任何对象(实际上Javascript中的所有内容都是一个对象)。
对于未定义的类型,只有一个值:undefined。
对于null类型,只有一个值:null。
因此,对于这两种情况,标签既是其类型,也是其值。
他们之间的区别。例如:
null是空值undefined是一个缺失的值
Or:
undefined还没有值null有一个值,但不再存在
实际上,null是一个特殊的关键字,而不是标识符,因此不能将其视为要赋值的变量。
然而,undefined是一个标识符。然而,在非严格模式和严格模式下,都可以创建一个名为undefined的局部变量。但这是一个可怕的想法!
function foo() {
undefined = 2; // bad idea!
}
foo();
function foo() {
"use strict";
undefined = 2; // TypeError!
}
foo();