`null`, `undefined` 和未声明变量的区别是什么?
您将如何检查这些状态?”Topics
JAVASCRIPT
在GitHub上编辑
未声明 当您将一个值分配给以前没有使用 var
、let
或 const
创建的标识符时,将创建变量。 未声明的变量将在目前范围之外在全球范围内加以界定。 在严格模式下,当你试图赋值到一个未声明的变量时,将会抛出一个 ReferenceError
。 未声明的变量是不好的,就像全局变量是不好的一样。 不惜一切代价避免他们! 若要检查它们,将其用法放在一个try
/catch
块中。
function foo() {x = 1; // Throws a ReferenceError in strict mode}foo();console.log(x); // 1
一个 undefined
变量是一个已经声明的变量,但没有赋值。 它是undefined
类型。 如果一个函数不返回任何值,作为执行它的结果赋值给一个变量,该变量的值也是undefined
。 若要检查它,请使用严格平等(===
) 运算符或 typeof
其结果是'undefined'
字符串。 注意,你不应该使用抽象的平等运算符来检查,因为如果值是 null
,它也会返回 true
。
var foo;console.log(foo); // undefinedconsole.log(foo === undefined); // trueconsole.log(typeof foo === 'undefined'); // trueconsole.log(foo == null); // true. 错了,不要用这个来检查!function bar() {}var baz = bar();console.log(baz); // undefined
一个 null
变量将被明确赋值给 null
的值。 它不代表任何价值,与 undefined
不同的是,它已被明确赋值。 要检查 null
只需使用严格的平等运算符进行比较。 注意,和上面一样,你不应该使用抽象的平等运算符(==
)来检查,因为如果值是undefined
,它也会返回true
。
var foo = null;console.log(foo === null); // trueconsole.log(typeof foo === 'object'); // trueconsole.log(foo == undefined); // true. Wrong, don't use this to check!
作为一个良好的习惯,永远不要让你的变量未被声明或未被赋值。 如果你还不打算使用它们,在声明后明确地将null
赋值给它们。 如果你在工作流程中使用一些静态分析工具(如 ESLint、TypeScript 编译器),它通常也能检查你是否引用了未声明的变量。