JavaScript 的数据类型【二】(数值)

  • A+

JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有八种。数值字符串布尔值这三种是原始类型。对象则称为合成类型。undefinednull,为两个特殊值。function,函数也为一种基础类型。ES6 添加了Symbol类型的值。

一.概念

1.整数和浮点数

  1. 在JavaScript 内部,所有数值都以64位浮点数形式储存,包括整数和浮点数
    1 === 1.0 // true
    
  2. 浮点数比较运算就会出现偏差
    0.1 + 0.2 === 0.3
    // false
    
    0.3 / 0.1
    // 2.9999999999999996
    
    (0.3 - 0.2) === (0.2 - 0.1)
    // false
    
  3. 数值构成
    • 第1位:符号位,0表示正数,1表示负数
    • 第2位到第12位(共11位):指数部分
    • 第13位到第64位(共52位):小数部分(即有效数字)
  4. 符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度

2.数值的精度和范围

  1. 数值精度,即-2的53次方到2的53次方,超出此精度则运算出现问题,支持最大的正整数
    Math.pow(2, 53)
    // 9007199254740992  最大整数
    
    // 多出的三个有效数字,将无法保存
    9007199254740992111
    // 9007199254740992000
    
  2. 数值范围,既2的1024到2的-1023之间,超出此数字范围则无法表示;数字大于2的1024次方,出现"正向溢出",返回Infinity;一个数小于等于2的-1075次方,"负向溢出",返回0
  3. Number.MAX_VALUE返回最大值,Number.MIN_VALUE返回最小值
    Math.pow(2, 1024) // Infinity
    Math.pow(2, -1075) // 0
    Number.MAX_VALUE // 1.7976931348623157e+308
    Number.MIN_VALUE // 5e-324
    

二.数值的表示

1.科学计数

  1. 使用'e'或者'E'表示位数
    123e3 // 123000
    123e-3 // 0.123
    -3.1E+12//-3100000000000
    .1e-5//0.000001
    
  2. JavaScript 会自动将数值转为科学计数法情况
    1. 小数点前的数字多于21位
    1234567890123456789012
    // 1.2345678901234568e+21
    
    123456789012345678901
    // 123456789012345680000
    
    1. 小数点后的零多于5个
    // 小数点后紧跟5个以上的零,
    // 就自动转为科学计数法
    0.0000003 // 3e-7
    
    // 否则,就保持原来的字面形式
    0.000003 // 0.000003
    

2.进制表示

  1. 十进制:没有前导0的数值。
  2. 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
  3. 十六进制:有前缀0x或0X的数值。
  4. 二进制:有前缀0b或0B的数值

三. 特殊数值

1.正零和负零

  1. +0-0都是0,没有区别,唯一区别是计算时做分母
    -0 === +0 // true
    0 === -0 // true
    0 === +0 // true
    (1 / +0) === (1 / -0) // false
    //(1 / +0)取值为+Infinity,(1 / -0)取值为-Infinity
    

2.NaN

  1. NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),如下情况出现NaN
    //1.在运算时会转换为数字,转换失败
    5 - 'x' // NaN  'x'
    
    //2.一些数学函数的运算结果会出现NaN
    Math.acos(2) // NaN
    Math.log(-1) // NaN
    Math.sqrt(-1) // NaN
    
    //3.0除以0也会得到NaN
    0 / 0 // NaN
    
  2. 特点:.NaN不等于任何值,包括它本身;.NaN在布尔运算时被当作false;.NaN与任何数(包括它自己)的运算,得到的都是NaN;.数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。具体示例如下:
    NaN === NaN // false
    Boolean(NaN) // false
    NaN + 32 // NaN
    [NaN].indexOf(NaN) // -1
    

3.Infinity

  1. Infinity表示无穷(出现情况:正值太大,负值太小,非0数值除以0)
    // 场景一
    Math.pow(2, 1024)
    // Infinity
    
    // 场景二
    0 / 0 // NaN
    1 / 0 // Infinity
    
  2. Infinity有正负之分,Infinity正无穷,-Infinity负无穷
    Infinity === -Infinity // false
    
    1 / -0 // -Infinity
    -1 / -0 // Infinity
    

四. 与数值相关的方法

1.parseInt()

  1. parseInt() 将字符串转换为整数;非字符串数据,先转换为字符串再转换为整数。
    //1
    parseInt('123') // 123
    
    //2. 自动去除空格
    parseInt('   81') // 81
    
    //3. 非字符串,转换字符串再转为整数
    parseInt(1.23) // 1
    // 等同于
    parseInt('1.23') // 1
    
    //4.字符串转为整数,一个一个字符转换,遇到不能转换字符返回
    parseInt('8a') // 8
    parseInt('12**') // 12
    
    //5.除 + -号外,其余的第一个数字不能转换则返回NaN
    parseInt('abc') // NaN
    parseInt('+1') // 1
    
  2. parseInt() 也可进行进制转换,第二个数字代表输入的进制,转换为10进制输出
    //二进制、六进制、八进制的1000,分别等于十进制的8、216和512
    parseInt('1000') // 1000
    // 等同于
    parseInt('1000', 10) // 1000
    parseInt('1000', 2) // 8
    parseInt('1000', 6) // 216
    parseInt('1000', 8) // 512
    

2.parseFloat()

  1. parseFloat() 将字符串转换为浮点数,表现出此情况与parseInt基本相同,但是没有进制转换。

3.isNaN()

  1. isNaN方法可以用来判断一个值是否为NaN;isNaN只对数值有效,如果传入其他值,会使用Number()先转成数值
    //1
    isNaN(NaN) // true
    isNaN(123) // false
    
    //2
    isNaN('Hello') // true
    // 相当于
    isNaN(Number('Hello')) // true
    
    //3
    isNaN({}) // true
    // 等同于
    isNaN(Number({})) // true
    //如下数组中为字符串
    isNaN(['xzy']) // true
    // 等同于
    isNaN(Number(['xzy'])) // true
    
    //4.对于空数组和只有一个数值成员的数组,isNaN返回false
    isNaN([]) // false
    isNaN([123]) // false
    isNaN(['123']) // false
    

4.isFinite()

  1. isFinite方法返回一个布尔值,表示某个值是否为正常的数值;除了Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true
    isFinite(Infinity) // false
    isFinite(-Infinity) // false
    isFinite(NaN) // false
    isFinite(undefined) // false
    isFinite(null) // true
    isFinite(-1) // true
    
zhangfeng

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: