undefined的字面意思是:未定义的值。这个值的语义是:希望表示一个变量最原始的状态,而非人为操作的结果
申明了一个变量,但是没有赋值
var floor;
console.log(floor)//undefined
访问floor返回了undefined,表示这个变量声名了以后,就从来没有使用过,也没有定义任何有效的值,即处于一种原始而不可用的状态。
访问对象不存在的属性
console.log(Object.floor)//undefined
var arr = []
console.log([0])//undefined
访问Object对象上的floor属性,返回undefined,表示object上不存在或者没有定义名为floor的属性,数组中的元素也属于对象属性,访问下标就等于访问这个属性,返回undefined,就表示数组中不存在这个元素。
函数定义了形参,但是没有传递实参
//函数定义了实参a
function hello(a){
console.log(a)//undefined
}
hello()//没有传递实参
函数hello定义了形参a,但是hello被调用的时候,没有传递参数,因此hello运行时参数a就是一个原始,未被赋值的变量。
使用void对表达式求值
void 0 //undefined
void false //undefined
void [] //undefined
void null //undefined
void 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 null
undefined.toString()//can't read property 'toString' of undefined
ECMAScript规范认为,既然 null和undefined行为很相似,而且都表示一个无效的值,那么它们表示的内容也具有相似性
console.log(undefined == null)//true
不要试图通过转换数据类型来解释这个结论
Number(null)//0
Number(undefined)//Nan
在比较想等性之前,null没有被转换为其它类型
null == 0 //false
但 === 会返回为false,因为安全操作 ===在比较相等性的时候,不会主动转换分项的数据类型,而两者又不属于同一种类型
undefined === null //false
undefined !== null//true
用一句话来总结两者的区别就是:undefined表示一个变量自然的,最原始的状态值,而null表示一个变量被人为的设置为空对象,而不是原始状态。所以在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显示的赋值undefined,当需要释放一个对象时直接赋值为null即可。
微信公众号关注 “学识铺子” 回复 ‘null和undefined’ 即可阅读