js的undefined和null的区别(二)

400 阅读3分钟

上篇笔记说到了undefined的,这篇笔记说的是null

null来自了哪里?

和undefined的一样,null是简单数据类型Null的默认值(唯一值)。

还记得的给变量赋值为undefined其实是window.undefined吗?undefined是window的一个属性。

而null是字面量,从逻辑角度看来,null值表示一个空对象指针,指示变量为指向任何对象。可以把null作为尚未创建的对象更好理解。

什么情况下会得到null

举个栗子:

  <div id="app"></div>
  <script>
    let obj = document.getElementById('app');  //getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用
    console.log('obj',obj);      
    let obj2 =  document.getElementById("container");
    console.log('obj2',obj2)    //obj2 null
  </script>

getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用。但是id为container不存在所以返回了null。

typeof null

上面说到null是数据类型Null的唯一默认值,那使用typeof操作符去检测null得到的是不是就是Null?

当然不是啦:

image.png

一方面:上面说到null值表示一个空对象指针其实就是一个空对象。所以typeof检测出来是object也可以说的过去。

另一方面:在JavaScript最初的实现中,JavaScript中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是0.由于null表示的是空指针,因此null的类型标签有也成为了0,typeof null就错误的返回了“object”。在ES6中,当时曾经提案为历史平反,将typeof null的值纠正为null,但是最后提案被拒所以还是保持“object”类型。

如何null判断

从上面分析得知我们已经不能像判断undefined一样使用typeof操作符来安全的进行判断一个值是否为null了。

但是可以使用:使用严格相等符合或者不相等操作符!==判断

    let  obj3 =  null;
    console.log(typeof obj3)    //object
    console.log(obj3 === null)  //true

null的使用

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

第一种情况:义的变量在将来用于保存对象,那么最好将该变量初始化为null。 这样做的好处是有助于进一步区分null和undefined 第二种情况:解除引用---当一个数据不在需要使用时,我们可以将该值设置为null来释放其引用。 解除引用不意味着自动回收该值所占用的内存,它真正的作用是让值脱离执行环境以便垃圾收集器在下次运行时将其回收,还有助于消除可能出现的循环引用的情况。消除引用常适用于大多数全局变量和全局对象的属性,局部变量还在他们离开执行环境是自动解除引用。

undefined和null的区别

综上所述,我们回到文章标题来总结一下,总结之前打印一下undefined == null结果会是啥呢?

image.png 实际上undefined值是派生值null值的,因此ECMA-262规定对它们的相等性测试要返回true。

使用的是标准相等符==,这个操作符出于目的会转换其操作数为相同类型后再做比较;

严格相等符不会进行类型转换,然而undefined与null属于不同的类型,所以不相等;

undefined是用来填补null的坑的

JavaScript的最初版本是这样区分的:null是一个表示"无"的对象(空对象指针),转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。

image.png

现在自己问自己undefined和null的区别的时候脑子里有点东西了,希望过段时间再看到这种问题是时候脑子还能记得些什么。

谢谢cavszhouyou.top/JavaScript%… 的作者的总结, 谢谢截图里的前端老张。