简单区分
一般来说,null和unknown都代表空。主要区别在于,unknown 表示尚未初始化的变量值,而null 表示故意缺少变量的对象指针。
变量unknown基本上是未定义的。 隐藏空值null被定义但不指向内存中的对象。
MDN 中给出的定义
值null 是一个文字,与未知不同。全局对象。 null 是缺失标志,表明该变量没有指向任何对象。如果将null 视为尚未创建的对象,可能会更容易理解。当返回类型预计为对象但没有关联值时,通常在API 中使用Null。
null
未定义是全局对象的属性。即全局范围内的变量。未知的初始值是原始数据类型未知。
undefined
现在我们看一个比较经典的图。没有找到确切的来源。
一张神奇的图片
在更详细的了解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。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。