null 和undefined都是JavaScript里的简单数据类型,平时很容易弄混他俩的用法与区别。通常静态类型语言里都只有一个来表示“空”的类型,好比java里的null,那为何JavaScript里有两个呢?javascript
在设计JavaScript之初,就只有null来表明空,null能够经过Number()转换成0。可是设计者以为一个不够。缘由以下:java
1. null被当成一个对象,在JavaScript中,有原始类型和合成类型两大类,设计者以为用对象来表示空很差。bash
2. JavaScript设计之初没有错误处理机制,若是数据类型不匹配,要么自动转换类型,要么就默默失败,null会自动转换成0,这样很不容易发现错误。函数
因此,undefined诞生了。ui
if (!undefined)
console.log('undefined is false');
// undefined is false
if (!null)
console.log('null is false');
// null is false
undefined == null
// true复制代码
parseInt(null)
NaN
parseInt(undefined)
NaN复制代码
最初的时候区分是这样的: null表示一个无的对象,转换为数值时是0, undefined表示无的原始值,转成数值是NaN.spa
可是实际用的时候,发现不行啊 ,他俩太像了。prototype
null表示没有对象,此处不应有值。设计
常常用在: code
①表示函数的参数,表明此参数不是对象 对象
② 做为对象原始链的终点。
Object.getPrototypeOf(Object.prototype)
// null复制代码
undefined表示缺值,就是此处应该有值,可是没定义。
常常用在:
①变量声明了可是没定义值;
②调用函数的时候,该传的参数没传,此时参数就是undefined
③对象没有赋值的属性,该属性值为undefined;
④ 函数没返回值时默认返回undefined
var i;
i // undefined
function f(x){console.log(x)}
f() // undefined
var o = new Object();
o.p // undefined
var x = f();
x // undefined
复制代码