undefined出现的形式?undefined代表什么意思?

来源:安卓之家时间:2022-12-06 09:04:01
简单区分

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

undefined

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

隐藏式 空值

null

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

声明式 空值

MDN 中给出的定义

null

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

undefined

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

一张神奇的图片

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

表现形式

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

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') // ture

let 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的布尔值是false,null的布尔值也是false,所以它们在比较时都转化为了false,所以undefined == null。

实际上并不是这样的。

ECMA在11.9.3章节中明确告诉我们:

Ifxisnullandyisundefined, returntrue.

Ifxisundefinedandyisnull, returntrue.

这是JavaScript底层的内容了,至于更深入的内容,如果有兴趣可以扒一扒JavaScript的源码。

为什么null + 1和undefined + 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;

关键词: undefined是什么意思 null和undefined对比如何 undefined出现的形式 undefined代表什么意思

相关阅读

推荐阅读

undefined出现的形式?undefined代表什么意思?

undefined出现的形式?undefined代表什么意思?

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

2022-12-06 09:04:01
上海华生电器怎么样?华生电器属于几线品牌?

上海华生电器怎么样?华生电器属于几线品牌?

近日通报2021年电风扇等重点产品专项监督抽查情况。抽查20批次电风扇产品,5批次不合格。涉及的不合格项目共计4个,标志和说明、稳定性和机更多

2022-12-06 08:53:06
业绩疲弱,何小鹏思过

业绩疲弱,何小鹏思过

业绩疲弱,何小鹏思过小鹏汽车的2022年第三季度财报会,犹如一场何小鹏的深刻检讨会。“坦诚地说,在实现长期战略目标的道路上更多

2022-12-06 08:40:02
【全球报资讯】电动车续航即将迎来重大突破! 国轩高科半固态电池预计年底实现装车

【全球报资讯】电动车续航即将迎来重大突破! 国

电动车续航即将迎来重大突破!国轩高科半固态电池预计年底实现装车近日,国轩高科在回答投资者提问时表示:该公司半固态电池匹配客户需求,预更多

2022-12-06 08:41:24
东风标致408X路试谍照曝光 或将2023年上市

东风标致408X路试谍照曝光 或将2023年上市

东风标致408X路试谍照曝光或将2023年上市近日,东风标致全新车型的路试谍照首次曝光。新车或为东风标致即将推出的全新全球车型408X。作为一款更多

2022-12-06 08:24:10
复古风设计/或搭插混动力 魏牌首款轿车谍照曝光

复古风设计/或搭插混动力 魏牌首款轿车谍照曝光

复古风设计 或搭插混动力魏牌首款轿车谍照曝光日前,网易汽车从相关渠道获取到了一组魏牌首款轿车的路试谍照。外观方面,结合谍照与此前曝光的更多

2022-12-06 08:37:41
每日速读!本田中国11月销量同比下滑超4成

每日速读!本田中国11月销量同比下滑超4成

本田中国11月销量同比下滑超4成12月5日,本田中国发布11月份销量数据。11月本田中国终端汽车销量为78126辆,同比下滑42 8%。1-11月本田中更多

2022-12-06 08:22:16
okwap是什么牌子的手机?okwap什么档次?

okwap是什么牌子的手机?okwap什么档次?

okwap手机,也就是国产手机品牌英华达手机,它旗下有三个系列的手机产品,分别是流行时髦的A系列、科技创新i系列、系统整合的S系列。那么,更多

2022-12-06 08:45:26
+ 点击查看更多精彩
字节跳动计划投资“大量资金”开发VR领域
    据 Protocol 报道,字节跳动正在认真考虑进入虚拟现实(VR)领域...
任天堂Switch曝光:合作伙伴招聘新游戏机开发工程师
    据外媒报道称,任天堂即将推新一代Switch,其中一个最有力的证据...
途牛发布纳斯达克股价不合规通知函
    4月18日,在途牛收到纳斯达克股价不合规通知函后,途牛方面发布声...
一加新机现身:搭载天玑8100处理器,主打快充和游戏
    今天,一款型号显示为PGKM10的一加新机现身GeekBench,这款新机搭...
紫光国微:预计2022年第一季度净利润同比增长69.9%
    紫光国微发布公告称,预计2022年第一季度归属于上市公司股东的净...
斯坦福大学建造小型太阳能电池板原型
    日前,斯坦福大学的研究人员已经建造了一个小型太阳能电池板原型...
    资讯播报