我想知道JavaScript中null和undefined之间的区别。
当前回答
如果变量未初始化,则该变量未定义。undefined不是对象。示例:var MyName;console.log(类型MyName);
检查控制台登录开发工具,它将被打印为未定义。
null是一个对象。如果您希望某个变量为null,则使用null。null变量存在,但值未知。它应该按语法方式分配给变量。null不会自动初始化。
示例:var MyName=null;console.log(类型MyName);检查csole登录开发工具,它将是一个对象。
其他回答
引自Marijn Haverbeke第三版《Elquent Javascript》:
undefined和null之间的含义差异是Javascript设计的一个意外,大多数时候这并不重要。如果你真的需要关注这些价值观,我建议你将它们视为可以互换的
老实说,一开始,我对这个建议有点怀疑。然而,在我自己的解释中,这是一种懒惰(或渴望)的方式来处理他们的分歧。也许,我们根本不需要处理这些差异。如果我们必须这样做,我们可以延迟我们的担忧(直到我们不得不这样做),而不是在这些值(null和undefined)流经我们的代码的每一步都过度/防御性地担心它。
PS:这不是对你问题的直接回答。这只是一个相关的观点。
const data = { banners: null }
const { banners = [] } = data;
console.log(data) // null
const data = { banners: undefined }
const { banners = [] } = data;
console.log(data) // []
undefined和null之间的含义差异是JavaScript设计的一个意外,大多数时候这并不重要。如果你真的需要关注这些价值观,我建议你将它们视为可以互换的。
来自Elquent Javascript书
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的真正数值相等性。
由于typeof返回undefined,undefineed是一种类型,其中null是一个初始值设定项,表示变量指向任何对象(实际上Javascript中的所有内容都是一个对象)。