大厂技术  高级前端  Node进阶

点击上方 程序员成长指北,关注公众号

回复1,加入高级Node交流群

前言

该文章用了我 两天 的时间来查各类资料,我尽可能的保证内容的 准确性
如果你对任何内容有 疑惑 或者 不同的见解 ,欢迎在评论区友善留言。

如果你是前端新人 ,看到 表现形式 这一章节就足够。
剩下的请收藏起来,待到以后想要更深入的了解,再继续阅读。

简单区分

总的来说 nullundefined 都代表空,主要区别在于 undefined 表示尚未初始化的变量的值,而 null 表示该变量有意缺少对象指向。

  • undefined

    • 这个变量从根本上就没有定义

    • 隐藏式 空值

  • null

    • 这个值虽然定义了,但它并未指向任何内存中的对象

    • 声明式 空值

MDN 中给出的定义

null

值 null 是一个字面量,不像 undefined ,它不是全局对象的一个属性。null 是表示缺少的标识,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解。在 API 中,null 常在返回类型应是一个对象,但没有关联的值的地方使用。

undefined

undefined全局对象 的一个属性。也就是说,它是全局作用域的一个变量。undefined 的最初值就是原始数据类型 undefined

一张神奇的图片

接下来我们看一张比较经典的图片,该图来自 stackoverflow 的回答,本人没有找到准确的出处。

表现形式

在更深入理解 nullundefined 的区别前,我们首先要知道 nullundefinedJS 中有什么不同的表现形式,用以方便我们更好的理解 nullundefined 的区别。

typeof

typeof null  // 'object'
typeof undefined  // 'undefined'
复制代码

Object.prototype.toString.call

typeof null  // '[object Null]'
typeof undefined  // '[object Undefined]'
复制代码

== 与 ===

null == undefined  // true
null === undefined  // false
!!null === !!undefined  // true
复制代码

Object.getPrototypeOf(Object.prototype)

JavaScript 中第一个对象的原型指向 null

Object.getPrototypeOf(Object.prototype)  // null
复制代码

+ 运算 与 Number()

let a = undefined + 1  // NaN
let b = null + 1  // 1
Number(undefined)  // NaN
Number(null)  // 0
复制代码

JSON

JSON.stringify({a: undefined})  // '{}'
JSON.stringify({b: null})  // '{b: null}'
JSON.stringify({a: undefined, b: null})  // '{b: null}'
复制代码

let undefiend = 'test'

function test(n) {let undefined = 'test'return n === undefined
}test()           // false
test(undefined)  // false
test('test')     // turelet undefined = 'test'  // Uncaught SyntaxError: Identifier 'undefined' has already been declared
复制代码

深入探索

为什么 typeof null 是 object?

typeof null 输出为 'object' 其实是一个底层的错误,但直到现阶段都无法被修复。

原因是,在 JavaScript 初始版本中,值以 32位 存储。前 3位 表示数据类型的标记,其余位则是值。
对于所有的对象,它的前 3位 都以 000 作为类型标记位。在 JavaScript 早期版本中, null 被认为是一个特殊的值,用来对应 C 中的 空指针 。但 JavaScript 中没有 C 中的指针,所以 null 意味着什么都没有或者 void 并以 全0(32个) 表示。

因此每当 JavaScript 读取 null 时,它前端的 3位 将它视为 对象类型 ,这也是为什么 typeof null 返回 'object' 的原因。

为什么 Object.prototype.toString.call(null) 输出 '[object Null]'

toString()Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。

JavaScript 万物皆对象,为什么 xxx.toString() 不能返回变量类型?

这是因为 各个类中重写了 toString 的方法,因此需要调用 Object 中的 toString 方法,必须使用 toString.call() 的方式调用。
对于 Object 对象,直接调用 toString()  就能返回 '[object Object]' 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

为什么 == 和 === 对比会出现 true 和 false ?

很多文章说:undefined 的布尔值是 falsenull 的布尔值也是 false ,所以它们在比较时都转化为了 false ,所以 undefined == null
实际上并不是这样的。
ECMA11.9.3 章节中明确告诉我们:

  1. If x is null and y is undefined, return true.

  2. If x is undefined and y is null, return true.

这是 JavaScript 底层的内容了,至于更深入的内容,如果有兴趣可以扒一扒 JavaScript 的源码。
至于 ===== 的区别,后续我会在其他文章中详细说明。敬请期待!

为什么 null + 1undefined + 1 表现不同?

这涉及到 JavaScript 中的隐式类型转换,在执行 加法运算 前,隐士类型转换会尝试将表达式中的变量转换为 number 类型。如:'1' + 1 会得到结果 11

  • null 转化为 number 时,会转换成 0

  • undefined 转换为 number 时,会转换为 NaN

至于为什么执行如此的转换方式,我猜测是 JavaScript 早期的一个糟糕设计。

从语言学的角度来看:
null 意味着一个明确的没有指向的空值,而 undefined 则意味着一个未知的值。
在某种程度上, 0 意味着数字空值。
这虽然看起来有些牵强,但是我在这一阶段能所最能想到的可能了。

为什么 JSON.stringify 会将值为 undefined 的内容删除?

其实这条没有很好的解释方式, JSON 会将 undefined 对应的 key 删除,这是 JSON 自身的转换原则。

undefined 的情况下,有无该条数据是没有区别的,因为他们在表现形式上并无不同:

let obj1 = { a: undefined }
let obj2 = {}console.log(obj1.a)  // undefined
console.log(obj2.a)  // undefined
复制代码

但需要注意的是,你可能在调用接口时,需要对 JSON 格式的数据中的 undefied 进行特殊处理。

为什么 let undefiend = 'test' 可以覆盖掉 JavaScript 自身的 undefined?

JavaScript 对于 undefined 的限制方式为全局创建了一个只读的 undefined ,但是并没有彻底禁止局部 undefined 变量的定义。

据说在 JavaScript 高版本禁止了该操作,但我没有准确的依据。

请在任何时候,都不要进行 undefined 变量的覆盖,就算是你的 JSON 转换将 undefined 转换为 '' 。也不要通过该操作进行,这将是及其危险的行为。

总结

关于使用 undefined 还是 null

这是一条公说公有理婆说婆有理的争议内容。
本人更倾向于使用 null ,因为这是显示定义空值的方式。我并不能给出准确的理由。

但关于使用 undefined 我有一条建议:
如果你需要使用 undefined 定义空值,请不要采取以下两种方式:

  • let a;

  • let a = undefined;

进而采取下面这种方式显式声明 undefined

  • let a = void 0;

结语

用了两天时间,终于将 undefinednull 的基本区别搞定了。

如果大家认为有任何需要 补充 的,或者有 错误 内容,请尽快在评论区留言。

关于本文

作者:sincenir

https://juejin.cn/post/7051144396615450655

Node 社群我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。如果你觉得这篇内容对你有帮助,我想请你帮我2个小忙:1. 点个「在看」,让更多人也能看到这篇文章2. 订阅官方博客 www.inode.club 让我们一起成长点赞和在看就是最大的支持❤️

深入探究 null 和 undefined 区别相关推荐

  1. 4. null 和 undefined区别?

    4. null 和 undefined区别? 首先 Undefined 和 Null 都是基本数据类型, 这两个基本数据类型分别都只有一个值, 就是 undefined 和 null. undefin ...

  2. null于undefined 区别

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...

  3. js中null和undefined区别

    null是空对象引用,引用指向为空 undefined是只定义了引用 typeof null:"object" typeof undefined : "undefined ...

  4. JS中NaN、null、Undefined区别

    1.NaN(not a number)非数字.不和任何数字相等,包括自己本身,可以用isNaN()判断,当praseInt()和praseFloat()不能解析时返回NaN.NaN为number对象下 ...

  5. js中null和undefined的区别

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理. 总所周知:null == un ...

  6. js 中null,undefined区别

    首先摘自阮一峰先生的文章: 大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil. 有点奇 ...

  7. Javascript 中的非空判断 undefined,null, NaN的区别

    JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS  的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...

  8. 为什么null为对象,并且null和undefined有什么区别?

    为什么在JavaScript中将null视为object ? 正在检查 if ( object == null )Do something 与...相同 if ( !object )Do someth ...

  9. 形象解释 undefined 和 null 之间的区别

    形象解释 undefined 和 null 之间的区别

  10. js的基本类型有哪些?引用类型有哪些?(二)------null和undefined的区别

    null和undefined的区别 1.类型的区别 console.log(typeof(undefined));//undefined console.log(typeof(null));//obj ...

最新文章

  1. php7伪静态 源码,PHPWind 8.5和8.7版的伪静态.htaccess规则
  2. 2019年Reddit机器学习板块17个最佳项目:最新代码、资源应有尽有
  3. C++利用构造函数限制对象的创建
  4. python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
  5. vue.js的使用总结
  6. CRM WebClient UI的external service功能介绍
  7. 深度学习导论(3)PyTorch基础
  8. linux chcon命令详解
  9. [验证码实现] Captcha 验证码类,一个很个性的验证码类 (转载)
  10. 设置控件输入的输入方式
  11. VC++ (MFC)调用 C#生成DLL的两种方法
  12. Ctfmon.exe是什么进程?
  13. 91卫图助手免费获取高清影像
  14. HTML之meta属性大全
  15. 【法律】如何保障未来夫妻合法权益:婚前房屋财产约定协议书
  16. 金洪林:红邦创衣止于至善_品牌-生活时尚_品牌_YOKA时尚网
  17. lay和lied_辨析:lie, lay, lain, lied, laid
  18. 【Python】利用滑动窗口计算全基因组每个窗口上CNV的拷贝数和Vst
  19. 3.2 Execution Model
  20. 简历中的项目经历怎么写?

热门文章

  1. 南京大学计算机化学会,南京大学理论与计算化学研究所
  2. 【OpenCV】 实战 银行卡卡号读取
  3. Xmarks Hosts
  4. 意创坊-移动富媒体平台
  5. WF 与 WCF 集成
  6. Dart中的构造函数
  7. Echars地图加散点图配置
  8. cocosCreator 骨骼动画
  9. pancakeswap 开盘抢跑机器人 (附代码)
  10. UDS诊断系列之七 安全访问(27)服务