一.相同点
1.Undefined类型和Null类型都只有唯一字面值,Undefined类型对应的字面值为undefined,Null类型对应的字面值为null。
2.两者在用取反运算符(!)处理时,都返回true,因此只通过取反运算符无法区分是null还是undefined。
console.log(!undefined); //true
console.log(!null); //true
3.访问Undefined或者Null类型值的属性或者方法,都会抛出一个引用异常。
var a,b=null;
console.log(a.name); //Cannot read property 'name' of undefined
console.log(b.name); //Cannot read property 'name' of null
4.在非严格相等的情况下,null与undefined是相等的。
console.log(null == undefined); //true
二.不同点
1.两者使用的场景不同,以下是出现undefined的两个常见场景。
访问一个声明但是并未初始化的变量
访问一个对象不存在的属性
//4.访问声明但未定义的变量
var param;
console.log(param); //undefined
//5.访问一个对象不存在的属性
var obj = {};
console.log(obj.name); //undefined
而null表示一个空对象的引用,一般是提前定义并用于在后面存储某个变量值。
根据eslint的规则,如果需要提前定义变量并在后面为变量赋值,建议初始化为null,而不是赋值为undefined。
var param1 = null; //推荐写法
var param2 = undefined; //不推荐写法
2.使用typeof运算符处理Null类型值返回object,Undefined类型值返回undefined。
console.log(typeof null); //object
console.log(typeof undefined); //undefined
3.类型转换规则不同,在转换为字符串类型时,null与undefined都会转换成对应的字符串’null’与’undefined’,而转换为数值类型时,null会转换为0参与计算,而undefined无法参与数值计算,返回NaN。
console.log(undefined + 'hello'); //undefined hello
console.log(null + 'hello'); //null hello
console.log(undefined + 1); //Nan
console.log(null + 1); //1