大家好,今天小编来为大家解答以下的问题,关于深入挖掘:null 和undefined 之间有什么区别?,这个很多人还不知道,现在让我们一起来看看吧!
变量undefined 基本上没有定义。定义了隐藏的空值null,但它不指向内存中的任何对象。
MDN 中给出的定义
null
值null 是一个文字,与undefined 不同,它不是全局的。对象的一个属性。 null 是缺失标志,表明该变量没有指向任何对象。将null 视为尚未创建的对象可能会更容易理解。在API 中,当返回类型预计为对象但没有关联值时,通常会使用null。
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 值的显式方法。我无法给出确切的理由。
用户评论
看完这篇博文,终于明白 null 和 undefined 的違い了!感觉之前搞混这两个概念导致好多代码错误啊
猜你喜欢
深入挖掘:null 和undefined 之间有什么区别?
简单区分总的来说 null 和 undefined 都代表空,主要区别在于 undefined 表示尚未初始化的变量的值,而 null 表示该变量有意缺少对象指
不明确的
今天,就让我们来揭秘一颗平凡无奇的马铃薯,它竟然能变身成为多种美味华丽的佳肴,不仅美味可口,还拥有丰富的营养价值。不得不说,马铃薯真的是个“隐形富豪”了!接下来
undefined 和null 的区别
引言JavaScript 作为一门广泛应用于前端开发的语言,其灵活性和强大的功能使其成为构建动态Web应用的首选。然而,对于初学者来说,理解 JavaScrip
丰田提交“TZ”商标申请,该商标将成为雷克萨斯新款三排电动SUV的名称
雷克萨斯正在筹备一款三排座电动SUV,这几乎已经是确定的事实。虽然它的具体名称尚未确定,但很有可能会使用“TZ”标识。这种推测是基于丰田最近向欧洲知识产权局(E
QQ上出现的tz是什么?
tz就是所谓的投资。这两年QQ里面打字圈衍生出了投资圈,里面的投资大部分都是上面所谓的主创自费的,像这种大部分都是会借钱跑路的,,只有少数自费是稳定的(因为他们
是时候冲刺了,每天10分钟,10天背初二上册词汇(第八单元)
育才双师课堂公益课,每天10分钟10天背完初二上册单词。学习方法:请严格执行下面的操作,每天只需15分钟。真简单,每天10分钟10天背完初二上册单词(Unit-
Yagami 第8 单元如何制作香蕉奶昔?单词和发音
八上单词及标准读音 Unit 8 How do you make a banana milk shake?shake /ʃeɪk/ n.&v.摇动;抖动 mil
42个动物英语单词!小学生:看看你认识几个?
各类动物的单词大家都会记得吗?fish?dog?cat?下面小编为大家整理了43种动物的英语单词,配合中英文和音标。基本涵盖了最常见的一些动物的“英语词汇”。f
单词学习火鸡
turkey /ˈtɜːrki/n. 火鸡;火鸡肉;土耳其(Turkey)1540s, originally "guinea fowl" (Numida mel
英语早读必听:八年级英语卷1单元8单词及录音
Unit 8 shake /ʃeɪk/ n.&v.摇动;抖动milk shake 奶昔blender/'blendə(r)/ n.食物搅拌器turn on 接通