当你没有提前使用var、let或const声明变量,就为一个变量赋值时,该变量是未声明变量(undeclared variables)。未声明变量会脱离当前作用域,成为全局作用域下定义的变量。在严格模式下,给未声明的变量赋值,会抛出ReferenceError错误。和使用全局变量一样,使用未声明变量也是非常不好的做法,应当尽可能避免。要检查判断它们,需要将用到它们的代码放在try/catch语句中。
1 | function foo() { |
当一个变量已经声明,但没有赋值时,该变量的值是undefined。如果一个函数的执行结果被赋值给一个变量,但是这个函数却没有返回任何值,那么该变量的值是undefined。要检查它,需要使用严格相等(===);或者使用typeof,它会返回‘undefined’字符串。请注意,不能使用非严格相等(==)来检查,因为如果变量值为null,使用非严格相等也会返回true。
1 | var foo; |
null 只能被显式赋值给变量。它表示空值,与被显式赋值 undefined 的意义不同。要检查判断null值,需要使用严格相等运算符。请注意,和前面一样,不能使用非严格相等(==)来检查,因为如果变量值为undefined,使用非严格相等也会返回true。
1 | var foo = null; |
作为一种个人习惯,我从不使用未声明变量。如果定义了暂时没有用到的变量,我会在声明后明确地给它们赋值为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。
参考
http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html