首页 > 自考资讯 > 自考知识

简述null和undefined的区别,undifined和null的区别

头条共创 2024-07-05

简单区分

一般来说,null和unknown都代表空。主要区别在于,unknown 表示尚未初始化的变量值,而null 表示故意缺少变量的对象指针。

变量unknown基本上是未定义的。 隐藏空值null被定义但不指向内存中的对象。

MDN 中给出的定义

值null 是一个文字,与未知不同。全局对象。 null 是缺失标志,表明该变量没有指向任何对象。如果将null 视为尚未创建的对象,可能会更容易理解。当返回类型预计为对象但没有关联值时,通常在API 中使用Null。

null

未定义是全局对象的属性。即全局范围内的变量。未知的初始值是原始数据类型未知。

undefined

现在我们看一个比较经典的图。没有找到确切的来源。

d055121956e64382a5e07d5692db9e54~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720788061&x-signature=CWP55HYq3vo2pLP47GPAVfe5Q0Q%3D

一张神奇的图片

在更详细的了解null和unknown的区别之前,我们首先需要知道null和undefined在JS中的不同表示,这样才能更好的理解null和unknown的区别。

表现形式

typeof null //'object'typeofknown //'unknown' 复制代码

typeof

typeof null //'[object Null]'typeofknown //'[object Unknown]' 复制代码

Object.prototype.toString.call

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

== 与 ===

JavaScript 第一个对象原型指向null。

Object.getPrototypeOf(Object.prototype) //复制null code

Object.getPrototypeOf(Object.prototype)

let a=unknown + 1 //NaNlet b=null + 1 //1Number(unknown) //NaNNumber(null) //0 code :010 -1010 复制JSON。 stringify({a: null}) //'{}'JSON.stringify({b: null}) //'{b: null}'JSON.stringify({a:known, b: null}) //'{b: null }'复制代码

+ 运算 与 Number()

function test(n) { letunknown='test' return n===unknown}test() //falsetest(unknown) //falsetest('test') //trueletunknown='test'//Uncaught SyntaxError: Identifier 'undefined' has not beenelaated 复制代码

JSON

let undefiend = 'test'

typeof null print as 'object' 实际上是一个低级错误,但到目前为止还无法修复它。

原因是早期版本的JavaScript 以32 位存储值。前3 位表示数据类型标志,其余位是值。

所有对象的前3 位都包含000 作为类型标志。在以前版本的JavaScript 中,null 被认为是一个特殊值,对应于C 的空指针。然而,C JavaScript 没有指针,所以null 表示什么都没有或者什么都没有,一切都用0(32)来表示。

因此每次JavaScript 读取null 时,其前端的3 位都会将其视为对象类型。所以typeof null 返回“object”。

深入探索

toString()是Object的原型方法。调用此方法时,默认返回当前对象的[[Class]]。这是[object Xxx] 形式的内部属性。 Xxx 是对象的类型。

为什么 typeof null 是 object?

这是因为每个类中都重写了toString方法,因此必须调用Object的toString方法,并且必须使用toString.call()来调用它。

对于Object对象,调用toString()直接返回'[object Object]'。对于其他对象,必须调用/apply才能返回正确的类型信息。

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

很多文章都说:unknown==null,因为unknown的布尔值是false,null的布尔值也是false,所以在比较的时候就转换成false了。

其实并不是。

ECMA 在第11.9.3 节中明确指出:

如果x 为null 并且y 未定义,则返回true。

如果x 未定义且y 为null,则返回true。

这是最低级别的JavaScript。如果您有兴趣,请参阅JavaScript 源代码以获取更多详细信息。

我们将在另一篇文章中更详细地讨论==和===之间的区别。敬请关注!

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

这包括JavaScript 中的隐式类型转换。隐式转换在执行加法运算之前将表达式中的变量转换为数值类型。例如,“1”+ 1 结果为11。

将null 转换为数字会将其转换为0unknown。当转换为数字时,它会转换为NaN。我认为这是由于JavaScript 的初始设计不佳造成的。

从语言学的角度来说:

null 表示没有指针的显式空值,unknown 表示未知值。

从某种意义上说,0 表示该数字为空。

这似乎有些牵强,但这是我目前能想到的最好的可能性。

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

事实上,JSON 删除了与未定义对应的键。这就是JSON本身的转换原理。

如果未定义,则该数据是否存在都没有区别,因为表示形式没有区别。

let obj1={ a:unknown }let obj2={}console.log(obj1.a) //unknownconsole.log(obj2.a) //unknown 复制代码,但您可能需要以JSON 格式取消定义,请注意。这就是了。您的数据将受到特殊处理。

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

JavaScript 通过全局创建只读undef 来限制undef,但并不完全禁止定义局部未定义变量。

据说在更高版本的JavaScript中禁止这个操作,但是没有确切的证据。

即使JSON 转换将undefined 转换为'',也不要覆盖未定义的变量。这也是非常危险的,所以请不要这样做。

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

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

这是一个有争议的内容,人民是对的,婆婆是对的。

我更喜欢使用null,因为它是定义null 值的显式方法。我无法告诉你确切的原因。

不过,我有一个使用undefined 的建议。

如果需要使用unknown来定义空值,请避免使用以下两种方法:

let a;let a=unnamed; 然后显式声明未知:

令a=void 0。

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢