JS 学习笔记2

学习来源:
https://wangdoc.com/javascript/types/number.html
https://github.com/camsong/blog/issues/9

null,undefined,boolean

null, undefined
  • 一般状况而言,null 和 undefined 所表达的意思基本相同,在相等运算符 == 中两者是相等的。
    console.log(undefined == null) // true

  • 基于历史原因,事实上 null 表示的是一个 空对象,转为数值时是 0, undefined 表示的是此处无定义,转为数值时是 NAN。

  • 当函数没有返回值时,默认返回时 undefined

boolean
  • 当 JS 预期某个位置是 boolean 时,该位置的值会自动转换为 boolean。下列会默认变为 false:
    • undefined --Number(undefined)//NaN
    • null --Number(null)//0
    • false --Number(false)//0
    • 0 --Number(0)//0
    • NaN --Number(NaN)//NaN
    • “”,’'空字符串 --Number("")//0
  • 需要注意[], {}在转变为 boolean 的时候是 true

数值

  • 在 JS 内部所有数字都是以 64 位浮点数形式储存!!!!!!

    • 由于浮点数不是精确的值,所以在涉及到小数的比较或运算的时候需要小心
      1 === 1.0//true
      0.1+0.2 === 0.3//false
  • 当需要使用到整数运算的时候,JS 会将 64 位浮点数转为 32 位整数。

数字的精度
  • JS 采用的是双精度浮点数,通俗的来说在 JS 中,浮点数有 64 个二进位数,具体信息如下。
  • 由於指數 E 也可以是負數,所以 E 的范围是0~2047,其中 [0,1022]为负数,[1024,2047]为整数.所以最终公式变为:
  • 如 4.5 转换成二进制就是 100.1,科学计数法表示是 1.001*2^2,舍去1后 M = 001。E是一个无符号整数,因为长度是11位,取值范围是 0~2047。但是科学计数法中的指数是可以为负数的,所以再减去一个中间数 1023,[0,1022]表示为负,[1024,2047] 表示为正。如4.5 的指数E = 1025,尾数M为 001。

特别提示一下十进位小数转二进位小数:
case1: 0.5 => 0.5*2 = 1.0 取整数,结果就是 0.1
case2: 0.85 => 0.85 * 2 = 1.7, 取整数1, 0.7 * 2 = 1.4,取整数1,0.4 * 2 取整数…

  • 由于这样的机制,导致像0.1,0.2无法用有限2进制表示的数,由于64位的限制,多出的bits就无法正确的表达,所以会出现小数计算错误的问题.

那么问题来了,为什么 x=0.1 看到的是 0.1?
事实上这只是刚好而已,由于精度的原因, M 的最大值为2^53=9,007,199,254,740,992,
转为科学表示法就是 9.007199254740992 * 10^15.所以最大的数字也就只能表示到16位的数字.然而 JS 的0.1实际上是0.100000000000000005551115123126,由于只能精确到16位数字,所以实际上只能得到 0.1000000000000000 所以会得到0.1.这件事情可以通过toPrecision()这个function验证.0.10000000000000000555.toPrecision(16) = 0.1,0.1.toPrecision(21) = 0.100000000000000005551,所以事實上只是你看到的是0.1。並不是真的0.1

  • 正如上面所描述的情況,事实上 JS 的整数精度就是 (-2^53 ~ 2^53),超过这个范围的就无法正确的表示了。并且超过的有效数字将无法保存。
console.log(Math.pow(2,53))
console.log(Math.pow(2,53)+1)
//9007199254740992
//9007199254740992
数值范围
  • 整数部分的范围简单记忆就是肯定能精确表示15位整数,16位的整数就可能会出现显示错误
  • 具体数值上实际能表示的数值大小可以到 (2^-1075[-1023+52], 2^1023),超过就会变为Infinity 和 0
console.log(Math.pow(2,1023))
console.log(Math.pow(2,1024))
console.log(Math.pow(2, -1075))

//8.98846567431158e+307
//Infinity
// 0
  • JS 提供 Number 对象下 MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
数值表示法
  • 以下情况 JS 会采用科学计数法
    • 小数点前大于21位
    • 小数点后零大于5位
console.log(1111111111111111)//16
console.log(1111111111111111111111)//22
//1111111111111111
//1.1111111111111111e+21
数值的进制
  • JS 支援4种进制
    • 10进制:没有前导0的数值。
    • 16进制:有前缀0x或0X的数值。
    • 8进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
      • 在ES6 已经去除前导0的表示,但是浏览器为了兼容还是可以使用。
    • 2进制:有前缀0b或0B的数值。
    0xff // 255
    0o377 // 255
    0b11 // 3
    
特殊数值
  • +0 和 -0

    • 二者唯一的区别就是作为分母时,一个返回 +Infinity,一个返回 -Infinity
  • NaN not a number

    • 当运算过程中无法用数字表示时,就会出现,计算错误时。注意 0/0 = NaN
    • 具有以下几个特性
      • 数据类型还是 Number
      • NaN不等于任何值
      • NaN不是 indexOf(NaN)
        ` [NaN].indexOf(NaN) // -1
      • 转为 Boolean 时是 false
      • NaN 与 Number 类的任何值预算都是NaN
  • Infinity

    • 超过范围时,就会出现 Infinity
    • 有±之分
    • Infinity === -Infinity // false
    • Infinity 大于一切数值除了 NaN,-Infinity 小于一切数
    • 0 * Infinity = NaN
    • 0/Infinity = 0
    • Infinity / 0 // Infinity
    • Infinity - Infinity // NaN
    • Infinity / Infinity // NaN
    • 注意 null 是一个空对象,进行运算的时候会先转换为 0 。
  • 全局方法简介

    • parseInt(str, number):参数是需要转换的 str 和 需要转换的进制数,面对不是整数的参数,会先将参数转换为整数,在进行转换.特别注意,如果第一个参数不是str,会先转换为 str 再转换为整数,如果失败就返回 NaN

      1. 特别注意,如果遇到不能转换的字元,就回传这个字元之前所有能转换的部分
      2. 如果这个字符第一个字符不能转换为数字(特例 ± 会往下看一位字元),那么回传NaN
      console.log(parseInt("1a2b"))
      console.log(parseInt("+1"))
      console.log(parseInt("+bb"))
      // 1
      // 1
      // NaN
      
      1. 还有一个小细节需要注意,如果给定的参数是科学计数法,或者是 JS 认为会转变为科学计数法表示的数字,那么parseInt 会先将其转换为科学计数法,然后再处理,这样就会回到规则 1 .
      parseInt(1000000000000000000000.5) // 1
      // 等同于
      parseInt('1e+21') // 1
      
      parseInt(0.0000008) // 8
      // 等同于
      parseInt('8e-7') // 8
      
      1. 如果遇到 0x 或者是 0X 开头,会先考虑是否为 16 进制,如果是就将其转换为 10 进制的结果输出.
      2. 0 开头的字符串就会按照 10 进制输出.
      3. 可以利用其进行进制转换,输入的必须是一个整数,不是整数的部分会被自动转换为整数,并且这个整数只能是[2,36]之间的才能得到有意义的结果,超过则返回 NaN. 如果是遇到转换为整数后为0的,则忽略.最终得到的结果都是10进制的整数.
      parseInt('1000', 2) // 8
      parseInt('1000', 6) // 216
      parseInt('1000', 8) // 512
      parseInt('1000', "37")//NaN
      
      console.log(parseInt('1000', ""))//1000
      console.log(parseInt('1000', "false"))//1000
      console.log(parseInt('1000', "null"))//1000 
      console.log(parseInt('1000', "undefined"))//1000 
      console.log(parseInt('1000', "0"))//1000 
      console.log(parseInt('1000', "NaN"))//1000         
      
      1. 在进制转换的过程中满足规则2.
    • parseFloat(str): 将 str 转换为浮点数

      1. 符合科学计数法,则会进行相应的转换.
        parseFloat('314e-2') // 3.14
      2. 满足parseInt的规则2
    • isNaN(Number): 判断一个值是否是 NaN

      1. 该方法只对数值有效,如果不是数值,则会先转换为数值,在进行判断.
      2. 因此该方法判断为 true 的并不一定是 NaN,也有可能是其它形态的资料.
        • 这里注意一下,Number([]) 是 0
          console.log(Number([]))//0
      3. 因此最好判定一个值是否是 NaN 的最好的方法就是判断是否跟自己严格相等.切记 NaN是唯一一个不等于自身的
        value !== value
    • isFinite(Number): 判断一个值是否为正常数值.

      1. 这里只需要特别注意一下,除了 Infinity, -Infinity, undefined, NaN是返回false.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值