javascript 中null 和 undefined 故事

看到代码:

log(null == undefined)  // true

这样故事就绑定了null 和undefined 为什么这种情况 返回的是true,null 和undefined 是同一回事吗?
在控制台经常看到的 not is undefinedis null以及 undefined 都是同一回事吗?
null 和undefined 不一样但是却有着相似的行为表现
注意:log 相当与 console.log() 用了结构,文章中出现的地方都一样,方便书写和使用

let {log} = console;

null

一个JavaScript的内置类型(基本类型),并且只有一个值就是null的特殊原始类型,
普通理解null 为空值的意思,其实严格意义上应该是空指针对象,不然很多现象就解释不通:
例如: 校验 字符串或者数字类型 使用typeof 得出预期结构

log( typeof 'muzi' === 'string') // true
log( typeof 111 === 'number') // true

可以看出有相同类型有字符串与之对应,null 却不在此列

log( typeof null === 'null') // false
log(typeof null) //object
log(typeof null === 'object') // true

有人认为 null === ‘object’ 是一个‘bug’,是一个遗留多年的‘bug’;其实 null 有属于自己的类型 Null,而不属于Object类型,之所以 typeof 之所以会判定为 Object 类型,是因为底层二进制原因 null 恰好是二进制中的0 ,而二进制中前三位数是0 被typeof 判断为 Object类型;这样看来说是bug也不为过;
也因此null 叫空值不太合适,应该叫空值对象或者空指针对象。比较好理解。

在来解释一下null 为空这字的理解,空,希望表示 一个对象被人为的重置为空对象,而非一个变量最原始的状态,也就是说不去定义为null 是不会自动生成的,定义一个变量不赋值其实是undefined对象;

至此回答一下 null == undefined 为 true 的问题,在 JavaScript 《JavaScript高级程序设计》一书写到

  “由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符”

因此这个问题是类型转化问题null 转化为未定义 之后变成来undefined 在js开发中判断类型一般用全等 === 是否相等
综合上述如何能判断一个类型是不是null 需要组合判断

let a =null;
(!a && typeof a === 'object')  // true 说明是一个null

undefined

undefined 是未定义值的意思,这个状态是一个原始值的状态,而非人为定义,因此typeof 判读为返回undefined

let b;
log(typeof b) // undefined
log(b)  //undefined

和定义一致,undefined 是一个原始状态,未定义的值
有意思的是 typeof 返回的undefined 未必是 未定义值,有可能是 is not defined , 未声名

log(typeof s) // undefined
log(s) // ReferenceError: s is not defined

没有用var 或者let 去定义变量 s ,但是typeof 返回 undefined,但是实际打印出is not defined
很多情况我们会吧is not defined 理解为 undefined 未定义,其实不然
is not defined 应该是未声名 undeclared 类型。
总结一下就是:
已在作用域中声明但还没有赋值的变量, 是 undefined 的。 相反, 还没有在作用域中声明 过的变量,是 undeclared(is not defined) 的。
为什么typeof 一个没有声名的变量 返回 undefined 这是因为 JavaScript的一个安全防范机制,不然这个地方就要报错,这个机制给我们在开发中带来很好的便利:
比如我们存在多个公用的js插件或者文件,里面可以能暴露出很多全局变量,这个时候安全机制就发挥重大作用:

// 抛出异常 ReferenceError
 if(plugins){   
	 console.log('执行插件。。')
 }
 // 安全操作
 if(typeof plugins !== 'undefined'){   
	 console.log('执行插件。。')
 }

因此也可以去判断一个方法存在与否,存在就直接调用,不存在就自己造一个:

function FeatureXYZ() { /*.. my XYZ feature ..*/ }
function doSomethingCool() {
let helper = (typeof FeatureXYZ !== "undefined") ? FeatureXYZ :function() { /*.. default feature ..*/ };
let val = helper(); // ..
}

typeof FeatureXYZ !== “undefined” 判断是否存在 执行相关的方法;

总结

总结两者的区别就是:undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可
二:is not defined 不是 undefined

你的关注是我书写的动力,请关注我,一起前行

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值