js中 underfined和null我们平时开发中都很常见,但是它们什么区别?下面我们详细讲解下他们!

1.undefined

1.undefined是个基本类型,顾名思义,未定义,没有定义这个值,所以给个undefined!

var a ;
console.log(a);//undefined

2.即便没声明变量,也可以用typeof来判断,其他地方用到这个未声明的变量会报错!

console.log(typeof b);//undefined
console.log(b)//Uncaught ReferenceError: b is not defined

3.undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量。undefined的最初值就是原始数据类型undefined,在ES3的时候可以修改它的值,到了ES5之后它的值是不可以改的!

var a ;
console.log(a===window.undefined);//true
window.undefined=1;
console.log(window.undefined);//undefined

4.其实在ECMAScript中,undefined不是一个保留字,所以它可以作为局部变量,这样的做法是非常不友好的,这样会使我们的代码难以维护和排错!

function test(){
    var undefined = "this is a test";
    console.log(undefined);//"this is a test" 此时undefined是个局部变量
    console.log(window.undefined);//undefined  全局window上的属性
}
test();

5.作为局部变量的undefined,那么我们用undefined就有风险,要么用window.undefined或者用void 0代替!

function test() {
    var undefined = 'not is undefined';
    var a;
    console.log(a === undefined);//false
    console.log(a === window.undefined);//true
    console.log(a === void 0);//true  void 0来代替undefined进行判断,因为void 0始终返回的都是原始值undefined
}
test();
//扩展下void
<a href="#">跳转链接</a> //每次不小心点到就会跳到顶端
<a href="javascript:void(0)">跳转链接</a> //void(0)是个空函数,没有返回值,所以是undefined,使得跳转失效
<a href="javascript:undefined">跳转链接</a>//等价于上面

6.实际上undefined值是派生自null值的,我们一般做类型判断都是用“”===“”!

var a;
console.log(a === undefined);//true
console.log(undefined == null);//true
console.log(undefined === null);//false

7.undefined是一个表示"无"的原始值,转为数值时为NaN!

console.log(1+undefined);//NaN
console.log(Number(undefined));//NaN
2.null

它不像undefined 是全局对象的一个属性。从逻辑角度来看,null值表示一个空对象指针,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解!
1.判断null类型

var a =null
console.log(typeof null) //object
console.log(a===null);//true  必须用严格等于   排出undefined情况

null值表示一个空对象指针,它代表的其实就是一个空对象,所以使用typeof操作符检测时返回”object”,在JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了”object”。在ES6中,当时曾经有提案为历史平凡, 将type null的值纠正为null, 但最后提案被拒了,所以还是保持”object”类型!

2.null是一个表示"无"的对象,转为数值时为0;

console.log(1+null);//1
console.log(Number(null));//0

那么我们在什么情况下需要将变量赋值为null呢?

1.如果定义的变量在将来用于保存对象,那么最好将该变量初始化为null,而不是其他值。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值,这样有助于进一步区分null和undefined

2.当一个数据不再需要使用时,我们最好通过将其值设置为null来释放其引用,这个做法叫做解除引用。不过解除一个值的引用并不意味着自动回收改值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器在下次运行时将其回收。解除引用还有助于消除有可能出现的循环引用的情况。这一做法适用于大多数全局变量和全局对象的属性,局部变量会在它们离开执行环境时(函数执行完时)自动被解除引用

总结:null代表空值,一个空的对象指针,你可以把它看成一个特殊的对象值,undefined是一个未初始化变量时的返回值,而null是一个尚未存在的对象时的返回值,由此可以把undefined看成一个空的变量,null看成是一个空的对象,它们有相似的地方,也有不同的地方,所以平时使用时要注意!

参考文献:javaScript深入理解之undefined与null