大家好,今天小编来为大家解答深入挖掘:null 和undefined 之间有什么区别?这个问题,很多人还不知道,现在让我们一起来看看吧!
undefined
undefined 是全局对象的属性。也就是说,它是全局范围内的变量。 undefined 的初始值是原始数据类型undefined 。
一张神奇的图片
接下来我们看一张比较经典的图。这张图来自stackoverflow的回答。我还没有找到确切的来源。
表现形式
在我们更深入的了解null和undefine的区别之前,我们首先要知道JS中null和undefine的不同表达方式,这样才能更好的理解null和undefine的区别。
typeof
typeof null //’object’typeof undefined //’未定义’
Object.prototype.toString.call
typeof null //'[object Null]’typeof undefined //'[object Undefined]’
== 与 ===
null==undefined //truenull===undefined //false!null===!undefined //true
Object.getPrototypeOf(Object.prototype)
JavaScript 中第一个对象的原型指向null。
Object.getPrototypeOf(Object.prototype) //null
+ 运算 与 Number()
let a=undefined + 1 //NaNlet b=null + 1 //1Number(undefined) //NaNNumber(null) //0
JSON
JSON.stringify( {a: undefined}) //'{}’JSON.stringify({b: null}) //'{b: null}’JSON.stringify({a: undefined, b: null}) //'{b: null}’ 010-第1010章1010 ‘undefined’ 已被声明
let undefiend = ‘test’
深入探索
typeof null 输出为’object’ 实际上是一个低级错误,但到目前为止还无法修复。
原因是在JavaScript 的初始版本中,值以32 位存储。前3 位表示数据类型的标志,其余位是值。
对于所有对象,前3 位都使用000 作为类型标志。在早期版本的JavaScript 中,null 被认为是一个特殊的值,对应于C 中的null 指针。但是C 中的JavaScript 中没有指针,因此null 表示什么都没有或void,用全0(32)表示。
因此,每当JavaScript 读取null 时,其前端的3 位都会将其视为对象类型,这就是typeof null 返回’object’ 的原因。
为什么 typeof null 是 object?
toString()是Object的原型方法。调用该方法时,默认返回当前对象的[[Class]]。这是格式为[object Xxx] 的内部属性,其中Xxx 是对象的类型。
为什么 Object.prototype.toString.call(null) 输出 ‘[object Null]’
这是因为每个类中都重写了toString方法,所以需要调用Object中的toString方法,必须使用toString.call()来调用。
对于Object 对象,直接调用toString() 将返回'[object Object]’ 。对于其他对象,需要调用/apply返回正确的类型信息。
JavaScript 万物皆对象,为什么 xxx.toString() 不能返回变量类型?
很多文章说:undefine的布尔值是false,null的布尔值也是false,所以比较的时候都转为false了,所以undefined==null。实际情况并非如此。
ECMA 在第11.9.3 节中明确告诉我们:
如果x 为null 并且y 未定义,则返回true。
如果x 未定义且y 为null,则返回true。
这是JavaScript的底层内容。至于更深入的内容,如果有兴趣,可以看一下JavaScript的源码。
为什么 == 和 === 对比会出现 true 和 false ?
这涉及JavaScript 中的隐式类型转换。在执行加法操作之前,隐式类型转换会尝试将表达式中的变量转换为数字类型。例如:’1′ + 1 将得到结果11。
当null转为number时,会转为0undefined。当转换为数字时,它将转换为NaN。至于为什么要进行这样的转换,我猜想这是JavaScript 早期的一个糟糕的设计。
从语言学的角度来看:null表示没有指针的显式空值,而undefined表示未知值。在某种程度上,0 表示数字为空。虽然这看起来有些牵强,但这是我现阶段能想到的最好的可能性。
为什么null + 1和undefined + 1表现不同?
其实这个也没有什么好的办法解释。 JSON会删除undefined对应的key。这就是JSON本身的转换原理。
在未定义的情况下,是否有这条数据没有区别,因为它们的表现形式没有区别:
let obj1={ a: undefined }let obj2={}console.log(obj1.a) //undefinedconsole.log(obj2.a) //undefined 但需要注意的是,调用时可能需要修改JSON 格式接口数据中未定义的进行特殊处理。
为什么 JSON.stringify 会将值为 undefined 的内容删除?
JavaScript 通过全局创建只读undefined 来限制undefined,但并不完全禁止定义局部未定义变量。
据说在更高版本的JavaScript中禁止这个操作,但我没有准确的依据。
请不要在任何时候覆盖未定义的变量,即使您的JSON 转换将undefined 转换为” 。也不要这样做,这是非常危险的。
为什么 let undefiend = ‘test’ 可以覆盖掉 JavaScript 自身的 undefined?
总结
这是一个有争议的内容,公众是对的,婆婆是对的。我更喜欢使用null,因为这是定义null 值的显式方法。我无法给出确切的理由。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/199432.html
用户评论
Hello爱情风
终于有人好好分析这两哥们了!之前写代码真经常搞混… 感觉定义变量的时候应该加个默认值,这样就不会弄丢这个东西了
有13位网友表示赞同!
半梦半醒i
这篇文章写的真清晰!把null和undefined的不同解释得透彻,以后不用再看代码报错的时候一头雾水了
有7位网友表示赞同!
来自火星球的我
我一直在用它们互换,感觉好像也没什么大关系啊,反正都是空的嘛。直到今天看了你的文章,原来是有区别的!太感谢分享这种知识了
有14位网友表示赞同!
她的风骚姿势我学不来
我还以为 null 和 undefined 就是同一个意思呢,看这篇文才知道原来不一样啊…… 以后写代码要注意区分才行
有14位网友表示赞同!
青瓷清茶倾城歌
确实,null 代表着明确的空值,而 undefined 是由于变量没有被赋值时产生的。这个区别的确十分重要,需要注意!
有14位网友表示赞同!
爱到伤肺i
终于明白了 为什么在 js 的编程中null和undefined会被用作空值。谢谢分享!
有7位网友表示赞同!
沐晴つ
很有启发性!我虽然平时写代码不经常用到 null 和 undefined ,但是理解它们的本质确实对程序设计有帮助。
有11位网友表示赞同!
岁岁年年
之前看一些教程都只是简单提了一嘴,这次终于详细了解了null和undefined的区别!这篇文章真的是太棒了!
有20位网友表示赞同!
眉黛如画
感觉这个题目的重点在于理解 null 和 undefined 在实际应用中的区别,而不是机械地记住它们各自的定义。
有12位网友表示赞同!
孤城暮雨
我认为 null 表示没有值的意思,而 undefined 则表示变量未被正确赋值。希望未来学习更多的编程知识!
有11位网友表示赞同!
柠夏初开
你说的很对!在日常编程中确实经常会遇到 null 和 undefined 的情况,需要认真对待它们之间的区别。
有8位网友表示赞同!
冷风谷离殇
看了这篇文让我更加深刻地理解了null和undefined的重要性。以后写代码要更加仔细。真的感谢你的分析!
有19位网友表示赞同!