null 和 undefined 的区别?
Null:
1.它用来表示一个空的对象
2.typeof检测一个null类型的变量返回的是 Object
console.lgo(typeof null) /* 这里打印的结果为Object */
Undefined:
1.已经声明但还未赋值的变量就是Undefined(有参函数在调用时未传参,其参数也是undefined)
2.typeof检测一个undefined类型的变量返回的就是undefined
var name1;
console.log(name1); /*这里打印的结果为undefined*/
console.log(typeof name1); /*这里打印的结果为undefined*/
console.log(typeof undefined) /*这里打印的结果为undefined*/
这里不得不提到一个在测试中遇到的问题:
一开始我写的测试代码是这样的:
var name; console.log(name); /*这里打印的结果为空白*/
奇怪,按正常套路这里应该打印的是undefined才对,可为什么是空白呢?
首先,我先换了几个浏览器测试,可依旧是这个结果。
于是,改用了let创建变量:
let name; console.log(name) /*这里打印的结果为undefined*/
这次使用let声明的变量成功的打印了undefined。
为什么会这样?
原来,var不在函数内部声明时,相当于声明的是全局变量,它会被加入到window对象中,可以通过 window.变量名 去访问它。我推测,window对象中已经存在了一个名为name的属性,所以console.log(name) 其实打印的是window.name。为了验证这个猜想,我又写了如下代码:
var name; console.log(name); /*这里打印的结果为空白*/ console.log(window.name) /*这里打印的结果为空白*/ console.log(typeof name); /*这里打印的结果为String*/ console.log(typeof window.name); /*这里打印的结果为String*/
如我所料,全局对象中确实已经存在了name属性,所以未赋值的情况下仍然打印了 空白 ,且为字符串类型。
而使用let声明的变量具有对应的变量作用域,所以console.log打印的是我声明的那个name。
使用var声明变量时,最好不要使用name命名!