js | undefined vs null vs void 0

背景

你就说为啥吧👇

console.log(null==undefined,null===undefined); // true false
console.log(null ==false,undefined==false) // fasle false
console.log(0==false,NaN==false) // true false

console.log(0==null,0<=null); // false  true
console.log(0==false,0<=false);// true  true
console.log(0==NaN,0<=NaN);// false  false
console.log(0==undefined,0<=undefined);// false  false
console.log(0==void 0,0<=void 0);// false  false

在这里插入图片描述

数据类型

在这里插入图片描述

  • undefinednull 都是js的基本数据类型。其中,null除非认为设置,否则,变量不会是null; 变量如果没有被赋值,默认是undefined; void 0 也是用来声明变量是undefined类型的

==中的类型转换

参考链接:js中==的隐式转换

  • 双等号,会发生类型转换,比如,‘1’==1,会把’1’转成1,再比较。除==之外,逻辑运算、比较运算等也会发生。
  • 怎么转换呢?根据上面的图,无非三大种,primitive vs primitive, object vs object, promitive vs object; 只写常见的
    • string vs number: string ->number
    • boolean vs number: boolean->number
    • object vs primitive: object.valueOf().toString()
    • nullundefined不会发生类型转换,但具有其他特殊性。

console.log(nullundefined,null=undefined); // true false

前置

  • js中,==,会先进行类型转换,然后再进行值比较。 ===先比较类型,再比较值
  • 对象的类型转换,先调用valueOf,再调用toSring

分析

  • 1==‘1’ // true发生了什么?
  • 先进行类型转换,都转换成number,然后再比较值,所以是true.
  • 照理,null == undefined,也是先进行类型转换,要么都是null 要么都是 undefined,然后再比较。但实际真的转换了吗?没有。有Number(‘1’),但貌似是没见过Undefiend(null)对吧。
  • null == undefiend的时候并没有发生类型转换,但应该有其他机制,代替了这个Undefiend(null)=undeifned,从而达到浅相等。因为null本来就有bug,所以不排除人家专门针对null == undefined进行了特殊处理,始终返回true。八股文的时候,就死记,null遇到==,就被当成undefined。

为什么要用void 0 代替undefined;

写得很好:https://juejin.cn/post/6844903832560861191

  • undefined是一个变量,允许更改。虽然现在,大多数浏览器中,全局作用域下,不允许更改,但是在函数作用域下,是允许更改的。p.s.(null是关键字,更改会报错,所以没有这个问题)

比如在chorme中,虽然不允许更改,如下,但ie8什么的,好像就有问题,全局下也允许更改

// 高chrome是正常的
undefined=1;
console.log(undefined) // undefined

// reason:
console.log(Object.getOwnPropertyDescriptor(window,undefined))

nodejs中把上面的window,换成global就行了。

  • 函数作用域,undefined的问题。如下,是可以直接更改的。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值