0%

null、undefined和未声明变量之间有什么区别?如何检查判断这些状态值?

当你没有提前使用varletconst声明变量,就为一个变量赋值时,该变量是未声明变量(undeclared variables)。未声明变量会脱离当前作用域,成为全局作用域下定义的变量。在严格模式下,给未声明的变量赋值,会抛出ReferenceError错误。和使用全局变量一样,使用未声明变量也是非常不好的做法,应当尽可能避免。要检查判断它们,需要将用到它们的代码放在try/catch语句中。

1
2
3
4
5
6
function foo() {
x = 1; // 在严格模式下,抛出 ReferenceError 错误
}

foo();
console.log(x); // 1

当一个变量已经声明,但没有赋值时,该变量的值是undefined。如果一个函数的执行结果被赋值给一个变量,但是这个函数却没有返回任何值,那么该变量的值是undefined。要检查它,需要使用严格相等(===);或者使用typeof,它会返回‘undefined’字符串。请注意,不能使用非严格相等(==)来检查,因为如果变量值为null,使用非严格相等也会返回true

1
2
3
4
5
6
7
8
9
10
var foo;
console.log(foo); // undefined
console.log(foo === undefined); // true
console.log(typeof foo === 'undefined'); // true

console.log(foo == null); // true. 错误,不要使用非严格相等!

function bar() {}
var baz = bar();
console.log(baz); // undefined

null 只能被显式赋值给变量。它表示空值,与被显式赋值 undefined 的意义不同。要检查判断null值,需要使用严格相等运算符。请注意,和前面一样,不能使用非严格相等(==)来检查,因为如果变量值为undefined,使用非严格相等也会返回true。

1
2
3
4
var foo = null;
console.log(foo === null); // true

console.log(foo == undefined); // true. 错误,不要使用非严格相等!

作为一种个人习惯,我从不使用未声明变量。如果定义了暂时没有用到的变量,我会在声明后明确地给它们赋值为null

  • null:表示一个值被定义了,定义为“空值”;
  • undefined:表示根本不存在定义。

所以设置一个值为 null 是合理的,如
objA.valueA = null;

但设置一个值为 undefined 是不合理的

null 表示”没有对象”,即该处不应该有值。典型用法是:

  • 1.作为函数的参数,表示该函数的参数不是对象。
  • 2.作为对象原型链的终点。
1
Object.getPrototypeOf(Object.prototype)// null

undefined 表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:

  • 1.变量被声明了,但没有赋值时,就等于undefined。
  • 2.调用函数时,应该提供的参数没有提供,该参数等于undefined。
  • 3.对象没有赋值的属性,该属性的值为undefined。
  • 4.函数没有返回值时,默认返回undefined。

参考

https://github.com/yangshun/front-end-interview-handbook/blob/master/Translations/Chinese/questions/javascript-questions.md#nullundefined%E5%92%8C%E6%9C%AA%E5%A3%B0%E6%98%8E%E5%8F%98%E9%87%8F%E4%B9%8B%E9%97%B4%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E5%88%A4%E6%96%AD%E8%BF%99%E4%BA%9B%E7%8A%B6%E6%80%81%E5%80%BC

http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html

-------------本文结束感谢您的阅读-------------