undefined与null的区别示例详解

 更新时间:2022年12月01日 09:44:31   作者:云梦泽_  
这篇文章主要为大家介绍了undefined与null的区别示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

  • 通过当前文章所在专栏的上一篇的文章学习我们可以知道 undefined == null 进行相等比较返回的结果是 true,但是具体是怎么样的,ES5 规范好像并没有明确的说明,这便引起了我的极度好奇,那么通过这篇这篇文章我们将揭开这个神秘的面纱。
  • 如果你还不是很熟悉 js 的类型,你可以看本专栏的往期文章,关注此专栏我想你能找到你想要的内容。

什么是undefined

  • 全局属性 undefined 表示原始值 undefined。它是一个 JavaScript 的原始数据类型。
  • 一个没有被赋值的变量是 undefined 类型。
  • 如果正在执行的变量没有分配值,则该 方法 或者 语句返回undefined`。请查看下图:

  • 在上图中,声明变量返回的是 undefined,而 typeof 返回的是类型字符串。
  • 如果一个函数没有返回值,那么该函数的返回结果是 undefined
  • 如果函数定义了有参数,但是没有函数调用参数,那么它也是 undefined
  • 为了证明以上的说法,请看下列代码:
function foo(x, y) {
  console.log(x); // 77
  console.log(y); // undefined
}
const bar = foo(77);
console.log(bar); // undefined

什么是null

  • null 特指对象的值未设置,它是 JavaScript 基本类型之一,在布尔值运算中被人误是 falsy
  • null 是一个字面量,不像 undefined,它不是全局对象的一个属性,指示变量未指向任何对象,把 null 作为尚未创建的对象也许更好理解。从逻辑上讲,null 表示一个空对象指针,这也是给 typeof 传一个 null 会返回 "object"的原因
  • 在获取 DOM 元素时,如果没有获取到,返回的是 null,原型链的最顶端也是 null,请看代码:
console.log(document.querySelector("moment")); // null
function foo() {}
console.log(foo.__proto__.__proto__.__proto__); // null
console.log(Object.__proto__.__proto__.__proto__); // null

重头戏来了

  • typeof 中分别对 undefinednull进行类型检查,请看以下代码:
console.log(typeof undefined); // undefined
console.log(typeof null); // object
  • typeof undefined 输出 "undefined"估计已经家喻户晓了吧,但是为什么 typeof null 输出的 "object",通过查阅资料得知,这是一个历史遗留问题,曾经有有一个 ECMAScript 的修复提案,但被拒绝了,这个似乎无法修复,因为它会破坏现有代码(此项目依靠该bug运行...)。
  • JavaScript 的第一个版本中,值存储在32位的单元中(相当于一条机器码),它由一个小型类型标记(1-3位)和值的实际数据组成。类型标记存储在单元的低位,其中:
  • 000: 对象,数据是对象的引用;
  • 1: 整型,数据是31位带符号的整数;
  • 010: 双精度,数据是双精度浮点数的引用;
  • 100:字符串,数据是字符串;
  • 110: 布尔值,数据是布尔值;

在 V8 引擎中,会把 JavaScript 热点代码编译成机器码,它是电脑CPU直接读取运行的机器码,运行速度最快,但是非常晦涩难懂,同时也比较难编写;机器码就是计算机可以直接执行,并且执行速度最快的代码;

  • undefinednull 是特殊的:
  • undefined:是整数 (-2)^30(超出整数的范围的数字);
  • null: 是机器代码 NULL 指针,或者说是一个对象类型标记加上一个为 0 的引用;
  • 好了,绕了这么远,该回来了,还是这个问题,为什么 typeof null 返回的是 "object",这下子应该就很好理解了吧。
  • 因为对象的类型标签是 0,由于 null 代表的是 空指针,在 JavaScript 中没有指针的概念,所以 null 32位全为 0 来表示。因此,typeof null 返回的是 "object"
  • 所以通过上面的总结, null 本质上是 0,请看以下代码示例:
console.log(undefined + 1); // NaN
console.log(null + 1); // 1
  • null 转化为 number 类型时,会转换为 0
  • undefined 转换为 number 类型时,会转换为 NaN
  • 那么使用上还有什么样的区别呢?继续上代码:
function foo(x = 77, y = "moment") {
  console.log(x); // 77
  console.log(y); // null
}
foo(undefined, null);
const [x = 1, y = 2] = [undefined, null];
console.log(x); // 1
console.log(y); // null

神奇吧,刺激吧,但是结束了😏😏😏

参考文章

以上就是undefined与null的区别示例详解的详细内容,更多关于undefined null区别的资料请关注脚本之家其它相关文章!

相关文章

  • 微信小程序授权登录的最新实现方案详解(2023年)

    微信小程序授权登录的最新实现方案详解(2023年)

    最近由于公司需要研究了一下微信小程序的开发,特此记录一下小程序登录授权的流程,便于自己理解,也希望对他人有多帮助,下面这篇文章主要给大家介绍了关于微信小程序授权登录的最新实现方案的相关资料,需要的朋友可以参考下
    2023-02-02
  • JavaScript通如何过RGraph实现动态仪表盘

    JavaScript通如何过RGraph实现动态仪表盘

    这篇文章主要介绍了JavaScript通如何过RGraph实现动态仪表盘,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • JS 对java返回的json格式的数据处理方法

    JS 对java返回的json格式的数据处理方法

    下面小编就为大家带来一篇JS 对java返回的json格式的数据处理方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 前端根据链接生成二维码的方案及相关常用API

    前端根据链接生成二维码的方案及相关常用API

    这篇文章主要介绍了qrcode插件的使用方法,包括ES6/ES7示例、常用API及Vue示例,同时还讨论了二维码的优点和缺点,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • javascript 实现子父窗体互相传值的简单实例

    javascript 实现子父窗体互相传值的简单实例

    本篇文章主要是对javascript 实现子父窗体互相传值的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • 使用threejs实现滚动效果的示例代码

    使用threejs实现滚动效果的示例代码

    某一天我在刷抖音时,看到一个UI设计师分享了一个好看的网页滚动动效设计,那种飘逸流畅的动画效果立刻抓住了我的眼球,我脑海里立刻开始想象用代码如何实现这个效果,所以本文给大家分享了如何使用threejs实现滚动效果,感兴趣的朋友可以参考下
    2024-01-01
  • window.onload追加函数使用示例

    window.onload追加函数使用示例

    这篇文章主要介绍了window.onload追加函数使用示例,需要的朋友可以参考下
    2014-03-03
  • 用JavaScript操作WinRar

    用JavaScript操作WinRar

    Blog的插入HTML功能有誤。 原來在blueidea.com上看到了用ASP執行解壓縮動作的文章,一直沒有去用心看,前日,趁老大不在,爽了一把,把它改成了用JavaScript操作的了。
    2008-04-04
  • 支持IE和FF的div+css选项卡

    支持IE和FF的div+css选项卡

    支持IE和FF的div+css选项卡...
    2006-11-11
  • JS判断点是否在线段上的代码

    JS判断点是否在线段上的代码

    这篇文章主要介绍了JS判断点是否在线段上的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11

最新评论