在ECMAScript规范中,一共定义了7种数据类型,对于它的分类方法也有很多,下面总结了一种简单清晰的分类方法:
1、基本类型:布尔,数值,字符串,undefined , null , Symbol
2、引用类型:Object
其中undefined和null他们俩数值都只有他们本身,且值都是空的意思,这个怎么理解呢?
- undefined:未定义。当变量只声明,但是没有赋值,此时默认值为undefined
- null:有定义,定义的值为空值
相同点:
- (1)值相等
console.log( undefined == null )//true
- (2)转布尔类型都是false
console.log( Boolean(undefined) )//false
console.log( Boolean(null) )//false
不同点:
- (1)数据类型不同
console.log( undefined === null )//false
- (2)转换为Number类型的值不同
console.log( Number(undefined) )//NaN
console.log( Number(null) )//0
例子:
console.log( undefined == null )//true
console.log( undefined === null )//false
为什么会出现上面的这种情况呢?
因为双等号是先判断数据类型是否相等,如果数据类型不相等的话,要先进行强制转换,比如说console.log(18 == ‘18’) 此时它这个里面就已经做了这个隐式转换。 undefined == null因为两者都默认转换成了false(双等于是判断两边的值是否相等,此时中间还有隐式转换)
而 三等于,他是直接判断数据类型,数据类型不同直接返回false(三等于是全等,用来判断两边的值和数据类型是否完全相等)
undefined 和 undeclared的区别
var a; // undefined
b; // b is not defined
区别:在变量作用域中已经申明但没有赋值的变量(如 a),是undefined。相反,在变量作用域中没有申明过的变量,是undeclared。
我们试图访问“undeclared ”变量时这样报错:ReferenceError: b is not defined。并且typeof 对undefined 和 undeclared 变量返回的都是undefined。其实“ undefined” 和“ is not defined ”是两码事。
总结:
- undefined相当于期房。 买了房,但是房子还没建出来。(未定义)
- null相当于毛坯房。买了房,但是房子没住人,里面是空的。(空值)