我们知道,当你直接打印一个未在全局环境下声明的变量时候,控制台会报引用错误,而你使用var关键字声明时候,再去打印,值是undefined,这是为什么呢?
console.log(a);//Uncaught ReferenceError: a is not defined
var a;
console.log(a);//undefined
我们都知道JavaScript内部存在预编译过程,对于未被赋值的变量会先附上undefined,如果后面有实际值再进行替换,所以第一行代码变量a虽然未被声明,其实a是有值的,我们使用typeof检查一下数据类型
console.log(typeof(a));//undefined
打印undefined,也不是String、Number、Null、Function和Object,那为什么在第二行代码先使用var关键字声明之后,就可以打印呢?答案是当你console.log时,会先确认改变量是否已经被声明,如果没有被声明,那么js直接给你报错,如果你使用过关键字var声明过,但未赋值,打印默认值。
还有一个问题,相信你们也发现了,就是js内部赋默认值是undefined,而不是null,为什么呢?
因为undefined相比null来说,undefined不会占用任何空间,而null的值是一个空对象指针,虽然空对象里面啥都没有,但是还会占用系统内存的,所以默认值是undefined,也只能是undefined。
总结:undefined和null
undefined和null的值相等,但类型不同
1、undefined:是所有没有赋值变量的默认值,自动赋值;
2、null:释放一个变量的引用对象,表示一个变量不在指向任何对象地址。
共同点:都是原始数据类型,保存在栈中变量本地
console.log(null == undefined);//true
console.log(null === undefined);//false
不同点:
1、undefined:表示变量声明过,但未必赋过值,而且它是所有未赋值变量的默认值;
2、null:表示一个变量将来可能指向一个对象,通常用于主动释放指向对象的引用。
var arr = ["沐雨橙风" , "一叶知秋"];
arr = null//释放指向数组的引用
当你使用完不太需要一个对象时候,通常将它设置为null,把原先指针剪短,重新指向一个空对象引用,这样方便js进行垃圾回收。