数据类型(二)Boolean、Number

303 阅读4分钟

Boolean类型

Boolean(布尔值)是JavaScript中最常用的类型之一,它的值只有两个,true和false。其他的值也可以通过Boolean()函数转换为布尔值。例如:

let list = 0
console.log(Boolean(list));

输出为false

其中,不同数据转换为Boolean值的规律为

数据类型转换为true的值转换为false的值
Booleantruefalse
string非空字符串""(空字符串)
Number非零数值(包括无穷值)0、NaN
Object任意对象null
UndefinedN/A(不存在)undefined

Number

Number类型就是数字,最普遍的就是十进制。

var message = 53

也可以赋值八进制或十六进制。八进制前面加个0,后面的数字不能超过8,如果其中有一个数字大于或者等于8,就会变回十进制

let list = 076 //八进制
console.log(list);

输出

image.png
十六进制前面加0x

let list = 0xf1 //十六进制
console.log(list);

输出

image.png

1. 浮点值

要定义浮点值,数值中必须包含小数点,而且小数点后面必须有一个数字。例如:

var message1 = 10.1
var message2 = 5.0
var message3 = .1 //有效,但不推荐

对于特别大或特别小的数字,可以使用科学记数法来表示,e后面是幂

let list1 = 2126356418e-7
console.log(list1); //输出 212.6356418
let list2 = 2.126e7
console.log(list2);  //输出 21260000

在js中浮点值运算不是很精确

let list1 = 0.1;
let list2 = 0.2;
let list3 = list1 + list2;
console.log(list3); //输出 0.30000000000000004

所以在精度要求比较高的场景中尽量别用js

2.值的范围

由于内存的限制,js不能支持世界上所有的数值。最小的值保存在Number.MIN_VALUE中(非负,下面有提到),大部分浏览器中的这个值为5e-324;最大的值为Number.MAX_VALUE,大部分浏览器中的这个值为1.7976931348623157e+308。

如果超过了最大值

console.log(Number.MAX_VALUE + Number.MAX_VALUE);

就会输出infinity(无穷大)

image.png
如果

console.log(Number.MIN_VALUE + Number.MIN_VALUE);

很多人会认为会输出输出-infinity(负无穷大),结果

image.png
因为MIN_VALUE代表的并不是负最小,而是最接近0的一个数 如果

console.log(-Number.MAX_VALUE - Number.MAX_VALUE);

就会输出-infinity(负无穷大)

image.png
如果判断一个值是不是无穷大值,可以通过isFinite判断

let message = Number.MAX_VALUE + Number.MAX_VALUE
console.log(isFinite(message));

如果是无穷大,返回false,不是则返回true

image.png

3.NaN

NaN就是不是数值的意思(Not a Number)。

console.log(0/0); //NaN 
console.log(-0/+0); //NaN 
console.log(5/0); //Infinity
console.log(5/-0); //-Infinity

NaN有个特殊属性,就是不等于任何值,包括它自己

console.log(NaN == NaN); //false

js中提供了一个判断NaN的方法isNaN

console.log(isNaN(NaN)); //true
console.log(isNaN(10)); //false 10是数值
console.log(isNaN("10")); //false 可转换数值
console.log(isNaN("blue")); //true 不可转换数值
console.log(isNaN(true)); //false 可转换数值

4.数值转换

js中有三个函数可以将非数值转换为数值,分别是Number()、parseInt()、parseFloat()

1.Number()方法

Number()可以用于任何数据类型,基于以下规则转换

  • 布尔值 ,true转换为1,false转换为0
  • 数值,直接返回
  • null,返回0
  • 字符串,遵循以下规则
    • 如果字符串包含字符,包括数值字符前面带加、减号的情况,则转换为十进制数值。如:Number("1")返回1,Number("123")返回123,Number("011")返回11(忽略前面的0).
    • 如果字符串包含浮点数,如“1.1”,则直接返回浮点数
    • 如果字符串包含有效的十六进制,如“0xf”,则会转换为改十六进制相应的十进制数值。
    • 如果是空字符串,则返回0
    • 如果字符串包含除上述情况之外的其他字符,则返回NaN。
  • 对象,调用valueOf()方法,并按照上述规则转换返回的值。如果转换的结果是NaN,则调用同String()方法,再按照转换字符串的规则转换。
console.log(Number("Hello world!")); //NaN
console.log(Number("")); //0
console.log(Number("0000010")); //10
console.log(Number(true)); //1

2.parseInt()方法

parseInt()更倾向于对字符串的转换,
1.如果是字符串,则从第一个开始转换,如果第一个是数字、加号或减号,则从第一个开始,到非数值为止,返回数值。如果第一个不是数字,直接返还NaN,如“1234blue”,则返回“1234” 2.空字符串返回NaN 3.带小数点返回整数部分,如22.5,返回22 4.可以识别不同的整数格式(十进制、八进制、十六进制)。就是0开头,就会转换为八进制;0x开头,就会转换为十六进制

console.log(parseInt("1234blue"));  //1234
console.log(parseInt(""));          //NaN
console.log(parseInt("0xA"));       //10
console.log(parseInt(22.5));        //22.5
console.log(parseInt("70"));        //70
console.log(parseInt("0xf"));       //15

parseInt也可以接受第二个参数,用作指定底数(进制数)

console.log(parseInt("f",16)); //15
console.log(parseInt("f"));    //NaN

3.parseFloat()方法

parseFloat()和parseInt()类似,只不过这个是解析到字符串末尾或者解析到一个无效的浮点数值字符为止,就是解析到第一个小数点是有效的,第二个小数点就无效了。

另一个不同支持就是它始终忽略字符串开头的0,十六进制始终返回0,因此只能解析十进制,不能指定底数

console.log(parseFloat("1234blue")); //1234
console.log(parseFloat("0xA")); //0
console.log(parseFloat("22.5")); //22.5
console.log(parseFloat("22.34.6")); //22.34
console.log(parseFloat("0908.5")); //908.5
console.log(parseFloat("3.125e7")); //31250000