最新的ECMAScript标准定义了7种数据类型:
- Boolean
- String
- Number
- Null
- Undefined
- Symbol
- Object
Null和Undefined
Null和Undefined都可以表示为没有的意思,并且在if语句中,都表示false。
var a=null;
var a=undefined;
上面代码中变量a被分别赋值为null和undefined,这两种写法实现的效果几乎是一样的。
if(!null){
consolo.log('null is false')
}
//null is false
if(!undefined){
console.log('undefined is false')
}
//undefined is false
null==undefined
//true
从上面👆的代码可以看出null和undefined在if语句中都表示为false,并且实现的效果也几乎是一样的。
但是为什么会有这两种似乎一致的数据的类型呢
1995年JavaScript诞生时,最初的设计是null只表示无,并且null可以自动转换为0
Number(null)
//0
10+null
//10
上面代码表示, null转化数字是0。
JavaScript的作者感觉这样可能不是很严谨,因为null也是被当做一个对象的,他认为无最好不是一个对象,并且null会自动转换为0,当时的JavaScript还不包括错误处理机制,很不容易发现错误。
所以他又设计了一个undefined,两者的区别是null表示一个空对象,转换为数值时为0;
undefined表示此处无定义的原始值,转换为数值时为NaN
Number(undefined)
//Nan
10+undefined
//NaN
使用场景
//声明了变量,但是没有赋值
var a;
//undefined
function fn(a){
return a;
}
//没有传入参数a,表示参数为空
fn();
//undefined
//参数a未设置任何值,这时候就可以传入null
fn(null);
//null
布尔
布尔 是英国著名的数学家,因为他对逻辑学做出的突出贡献,所以用他的名字来命名,以此来纪念这位伟大的数学家。
布尔类型只有真和假两个状态。真用true表示,假用false表示。
下面运算符会返回布尔值:
- 逻辑运算符:!container
- 相等运算符:
===,==,!==,!= - 比较运算符:
>,<,>=,<=
与其他类型的转换规则
转换规则除了以下六个值被转为false,其他都视为true
- false
- Null
- Undefined
- 0
- ""或 ''(空字符串)
- NaN
使用场景
布尔类型通常用于流程的控制,比如:
if(true){
consolo.log('hello');
}
//hello
注意,空数据([])和空对象({})对应的布尔值都是true
Number
整数和浮点数
JavaScript内部,所有数字都是以64位浮点数形式保存的,即使整数也是如此,所以1 和1.0是相同的,是同一个数。
1===1.0
//true
数值的进制
JavaScript对整数提供四种进制的表达方式:十进制,十六进制,八进制,二进制。
- 十进制:不是以0开头的数值
- 八进制:有前导
0o或0O的数值,或者有前导0并且只有0-7的八个阿拉伯数字的数值。 - 十六进制:有前缀
0x或0X的数值 - 二进制:有前缀
ob或者0B的数值
默认情况下,JavaScript内部会将八进制、十六进制、二进制,自动转换为十进制。
0xff //255
0o377 //255
ob11 //3
如果八进制,十六进制,二进制中出现了不属于该进制的数字,就会报错。
通常来说,有前导0的数字会被识别成八进制的数字,但是如果前导0后面有8或者9,就会被识别为十进制的数字。
特殊数值
正零和负零
JavaScript内部实际存在两个0,是+0和-0,区别就是64位浮点数表示法的符号不一致。它们是相同的。
-0===+0 //true
0===-0 //true
0===+0 //true
几乎所有的场合+0和-0都是当做正常的0。
+0 //0
-0 //0
(-0).toString() //'0'
(+0).toString() //'0'
唯一有区别的场合是做分母的时候,+0和-0的返回值是不一样的。
(1/-0)===(1/+0) //false
以上代码是不成立的,因为除以正0得到的是+Infinity,除以负0得到的是-Infinity,这两者是不相等的。
Nan
Nan是JavaScript的特殊值,表示“非数字”,(Not a Number),主要出现在把字符串解析成数字的出错的场合。
10-'a'
//Nan
上面代码运行时,会自动讲字符串a转换成数值,但是a不是数值,所有最后得到Nan,表示它是Nan 非数字。
0除以0也会得到Nan
0/0
//NaN
NaN并不是一个独立的数据类型,它是一个特殊的数值,它的数据类型依然是Number,使用typeof可以看到
typeof NaN
//number
NaN不等于任何值,包括它本身。
NaN === NaN
//false
数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立
[NaN].indexOf(NaN)
//-1
NaN在布尔运算时当做false
Boolean(NaN)
//false
**NaN与任何数(包括它自己)的运算结果都是NaN
1 + NaN
//Nan
NaN + NaN
//NaN
NaN / 1
//NaN
Infinity
Infinity表示无穷,用来表示两种场景,一种是正的数值太大,一种是负的数值太小,无法表示;另一种是0除以0得到Infinity。
Infinity有正负之分,+Infinity表示正的无穷,-Infinity表示负的无穷
Math.pow(4, 1024)
//Infinity
0 / 0
//NaN
1 / 0
//Infinity
0除以0会得到NaN,而非0数除以0会得到NaN
Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)
Infinity与NaN比较,总是返回false
0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity
0*Infinity
//NaN
0/Infinity
//0
Infinity/0
//Infinity
Infinity加上或乘以Infinity,结果都是Infinity
Infinity + Infinity
//Infinity
Infinity * Infinity
//Infinity
Infinity减去或除以Infinity,结果都是Nan
Infinity-Infinity
//NaN
Infinity / Infinity
//NaN
Infinity与null 计算时,null会转成0,等同与0的计算
null * Infinity
//NaN
null / Infinity
//0
Infinity / null
//Infinity
Infinity与undefined计算,结果都是NaN