2020-11-12

  undefined的字面意思是:未定义的值。这个值的语义是:希望表示一个变量最原始的状态,而非人为操作的结果

申明了一个变量,但是没有赋值

var floor;console.log(floor)//undefined

        访问floor返回了undefined,表示这个变量声名了以后,就从来没有使用过,也没有定义任何有效的值,即处于一种原始而不可用的状态。

访问对象不存在的属性

console.log(Object.floor)//undefinedvar arr = []console.log([0])//undefined

       访问Object对象上的floor属性,返回undefined,表示object上不存在或者没有定义名为floor的属性,数组中的元素也属于对象属性,访问下标就等于访问这个属性,返回undefined,就表示数组中不存在这个元素。

函数定义了形参,但是没有传递实参

//函数定义了实参afunction hello(a){console.log(a)//undefined}hello()//没有传递实参

函数hello定义了形参a,但是hello被调用的时候,没有传递参数,因此hello运行时参数a就是一个原始,未被赋值的变量。

使用void对表达式求值

void 0 //undefinedvoid false //undefinedvoid [] //undefinedvoid null //undefinedvoid function fn(){} //undefined

    ECMAScript明确的规定了void操作符对任何表达式求值都返回undefined,这和函数执行操作后没有返回值的作用是一样的,javaScript中函数都有返回值,当没有return操作时,就默认返回一个原始的状态值,这个值就是undefined,表明函数的返回值未定义。

     因此undefined一般用来表示某个表达式最原始的状态值,不是人为操作的结果,你手动赋值一个undefined这样做是没有意义的,因为一个变量不赋值就是undefined;
 

接下来说说我们的null 

 

      字面上的意思是空值,这个值的语义是,希望表示一个对象被人为的重置为空对象,而非一个变量最原始的状态。

       在内存中的表示就是栈中的变量没有指向堆中的内存对象。

 

 

当一个对象被赋值了null之后,原来的对象在内存中处于游离状态, GC会择机回收该对象并释放内存,因此如果需要释放某个对象,就可以吧这个对象设置为null,即表示该对象已经被清空了,目前无效状态

typeof null == 'object'

null有属于自己的类型Null,而不属于Object类型, typeof之所以判定为Object类型是因为JavaScript数据类型在底层都是以二进制的形式表示的,二进制的前三位为0会被typeof判断为对象类型,而null的二进制恰好都是0,因此null会被误判为object类型

000 - 对象,数据是对象的应用1 - 整型,数据是31位带符号整数010 - 双精度类型,数据是双精度数字100 - 字符串,数据是字符串110 - 布尔类型,数据是布尔值

我们可以通过其他方式获取null的真实类型

Object.prototype.toString.call(null);

通过object原型上的tostring()可以获取到JavaScript中对象真实数据类型,当然undefined也可以通过这种方式获取

Object.prototype.toString.call(undefinde);

然后让我们看看它们的相似性吧

null和undefined的语义和场景不同,单总而言之,它们都表示一个无效的值,因此在js中对这类值访问属性时,都会得到异常的结果;

 

null.toString()//can't read property 'toString' of nullundefined.toString()//can't read property 'toString' of undefined

 

ECMAScript规范认为,既然 null和undefined行为很相似,而且都表示一个无效的值,那么它们表示的内容也具有相似性

console.log(undefined == null)//true

不要试图通过转换数据类型来解释这个结论

Number(null)//0Number(undefined)//Nan

在比较想等性之前,null没有被转换为其它类型

null == 0 //false

但 === 会返回为false,因为安全操作 ===在比较相等性的时候,不会主动转换分项的数据类型,而两者又不属于同一种类型

undefined === null //falseundefined !== null//true

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

微信公众号关注 “学识铺子” 回复 ‘null和undefined’ 即可阅读

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值