[Js通关指南]-数据类型(第三章)

126 阅读6分钟

欢迎来到js通关指南(第三章)-数据类型

JavaScript是一个弱数据类型的动态语言
也就是说变量的数据类型是可以变化的

如何确定当前变量的数据类型?
JavaScript的变量类型只有在程序运行过程中根据等号右边的值才能确定数据类型。

注意 数据类型只讲关于这个类型的一些知识点, 详细的Api都在后面介绍 原始数据类型有 null  undefined  boolean  number  BigInt  String  Symbol Object

Number数字型

数字通常包含
1.  正负整数 如: 101 -101
2.  正负小数 如: 1.02  -0.1 
3.  0 +0 -0
4.  NaN 如: NaN  NaN 是特殊的数字表示不是一个数字
5.  二进制 八进制和十六进制0b111 0o10 0xA 
6.  科学计数法 let num =  3.125e7

1.   number 的进制问题

number 可以表示2进制 8进制 十进制 16进制

二进制 二进制以0b开头

let a =0b111

八进制 数字前面是0表示八进制 但在es6即以后 要使用0o表示八进制

let b=070; //八进制(目前这种写法已经废弃  采用 0o70)

十进制

let a=10//默认十进制
在十进制时候 是可以允许有小数的 在这种情况 可以允许
2.  .2 2 1e3 这些写法
let n1 =2.
let n2 =.2
let n3 =2
let n4 =1e3
let n5 =2.06

十六进制 数字前面是 0x是十六进制

let c=0xA ; //十六进制

 

注意 开发中尽量用十进制 少用16进制 别用八进制
开发时候尽量不要使用0开头的数字,因为工程化通常以ES5为兼容所以打包时候通常使用babel会转ES5语法导致问题

2.   关于浮点数(也就是小数)

1. 0.1 .1 表示浮点值 也可以用.1表示但是不推荐  

0.1 ===.1//true

2.  科学计数法

如果数值特别大可以使用 科学计数法

3.125e7 == 312500003e-7 == 0.0000003

3.  无法精确表示浮点数

在js 中无法精确的标识浮点数 如 0.1+0.2!=0.3是正确的 原因是: 计算机底层只有0 和 1, 所以所有的运算最后实际上都是二进制运算。十进制整数利用辗转相除的方法可以准确地转换为二进制数,但浮点数呢?

先看下面一张图,是关于IEEE 754标准(IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号):

image.png 这个标准是JS的浮点数的实现标准,大概解释一下这张图就是:

  • 第一位是符号位
  • 中间11位代表的是指数位
  • 最后的52位代表尾数位

也就是说,浮点数最终在运算的时候实际上是一个符合该标准的二进制数

为了验证该例子,我们得先知道怎么将浮点数转换为二进制,整数我们可以用除2取余的方式,小数我们则可以用乘2取整的方式。

0.1转换为二进制:

  • 0.1 * 2,值为0.2,小数部分0.2,整数部分0

  • 0.2 * 2,值为0.4,小数部分0.4,整数部分0

  • 0.4 * 2,值为0.8,小数部分0.8,整数部分0

  • 0.8 * 2,值为1.6,小数部分0.6,整数部分1

  • 0.6 * 2,值为1.2,小数部分0.2,整数部分1

  • 0.2 * 2,值为0.4,小数部分0.4,整数部分0

  • 从0.2开始循环

0.2转换为二进制:

  • 可以直接参考上述,肯定最后也是一个循环的情况

所以最终我们能得到两个循环的二进制数:


我们可以看一个例子:

image.png

0.1:0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1100 ...

0.2:0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 ...

这两个的和的二进制就是:

sum:0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 ...

所以最终我们只能得到和的近似值(按照IEEE 754标准保留 52位,按 0舍1入 来取值)

利用按权相加法,sum的十进制数则为:

sum ≈ 0.30000000000000004
原文=> 关于JS浮点数运算不精确的原因和解决方案 - 知乎 (zhihu.com)
ps:这个我知道,但是自己举例子比较麻烦直接搬一下别人的结果了。

如何解决这个问题

1.将小数x 10的n次方转为 整数, 再相加然后除 10的几次方

2.保留几位小数后四舍五入

3.或者是 判断0.1+0.2 与0.3 的差小不小于js能表示的最小数,如果小于则表示相等 4. 使用库 如 big.js

4.   无穷大/小与最大/小值

Infinity 表示无穷大  大于任何数
-infinity表示无穷小  小于任何数

js中number可以表示数字的最大值

Number.MAX_VALUE 最大
Number.MIN_VALUE 大于0的最小值

5.   关于NaN的判断与计算

注意 NaN 虽然 翻译为 not a number 但是他是number 类型,NaN  代表一个非数值

0/0  -0/+0 都得 NaN
5/0 5/-0 得正负 Infinity
NaN参与任何操作(运算)都得NaN

        

NaN 与字符串拼接会拼接

let AA= NaN;
console.log(AA+"1"); //NaN1

判断NaN 这里js 提供了isNaN 来判断是NaN 在执行时候会先转一下Number 能转的话也是false

如:

isNaN(NaN) //true

isNaN("1") //false

isNaN(1) // false

isNaN("FAADA") //true

isNaN(true) //false

6.   其他类型转number

其他类型 =>number

true1
false0
数值如 123456123456
null0
Undefined/Object / Array...NaN
字符串”123456”123456
字符串 “+123” “-123”123 -123
字符串 “0123”123
字符串 “0.123”0.123
字符串 “.123”0.123
字符串 +0.123  -0.1230.123  -0.123
bigInt 123n  1000000000000000000000n123   1e+21
symbolcannot convert a symbol value to a number

 

注意:

js进行整数计算时,一般可以保证精确 js进行浮点数运算时候,可以获得一个不精确的结果,所以不要使用js进行对精确度要求比较高的运算

Undefined 

变量声明为设置值就是undefined

undefined+1  NaN

true +undefined  NaN

undefined+str=undefinedstr

true +1 =2

false +1 =1

Boolean 布尔型

String 字符串型

Undefind 未定义

Symbol 符号类型

BigInt 大数类型

Null 空型

Object 对象