JS 数据类型

164 阅读6分钟

数字与字符串

问:都是一,为什么要分 1 和 "1"

功能不同

  • 数字是数字,字符串是字符串,要严谨

  • 数字能加减乘除,字符串不行

  • 字符串能表示电话号码,数字不行

存储形式不同

  • JS中,数字是用64位浮点数的形式存储的

  • JS中,字符串是用类似UTF-8形式存储的(UCS-2)

如何存数字

十进制转二进制即可

二进制

10转2

  • 31变成二进制

  • 尝试后得到:31(十进制)=011111(二进制)

2转10

  • 100011变成十进制

  • 每一位乘以2的N次方,然后加起来

  • 100011=2^5+2^1+2^0=35

用十六进制表示二进制

为什么用十六进制?

  • 因为二进制写起来太慢了:011110001011010

  • 记住 8 4 2 1 对应 x x x x

  • 从右往左每四位改写成一位:011110001011010

  • 得到 3 , 12 , 5 , 10 ;把大于9的数字改为 A B C D E F

  • 于是得到 3C5A ,你也可以用计算器的程序员模式

HEX表示16进制;BIN表示2进制

OCT表示8进制,DEC表示10进制

如何存字符

转成数字不就得了,但是注意,'1' 不能用 1 来表示

如何存储 a b c 1 2 3(答:编号表示)

  • 用 0~127 表示所有的符号

1.png

注意: 0用48表示,A用65表示,a用97表示

怎么表示中文?

简单,编号,中国国家标准局来编,名称【国家2312】

2.png

怎么表示生僻字、繁体字、韩文呢?

  • 微软推出了一个国际扩展,简称GBK

3.png

显示不了藏文,泰文怎么办?

  • 继续编号

  • 万国码(Unicode)

Unicode

优点

  • 已收录13万字符(大于16位),全世界通用

  • 以后还会继续扩充,不会停止

  • 最新版只添加了一个字——令和的合体字

缺点

  • 两个字节不够用,每个字符要用三个及以上字节

  • 这样所有文件都扩大50%,不划算

虽然用Unicode,但存的时候偷懒,于是:UTF-8就被发明出来了。

存储 [a]

  • a对应的Unicode编号为97,十六进制61

  • Unicode直接存:0000 0000 0000 0000 0110 0001

  • UTF-8 偷懒存法: 0110 0001

  • 三字节变一字节,比GBK还省

存储 [你]

  • 你对应的Unicode编号为4F60

  • Unicode直接存:0000 0000 0100 1111 0110 0000

  • UTF-8 偷懒存法:1110 0100 1011 1101 1010 0000

  • 还是三字节,没有省,但是字母都能省一点

UTF-8 中的8的意思是

  • 最少可用8位存一个字符

UTF-8 的规则

以 [你a] 为例

1110 0100 1011 1101 1010 0000 0110 0001

  • 读8位信息1110 0100

  • 发现开头有3个1,说明这个字符有3个八位

  • 于是再读两个8位信息 1011 1101和1010 0000

  • 这就还原为Unicode 的 [你]

  • 0000 0000 0100 1111 0110 0000

  • 再读8位信息 0110 0001

  • 发现开头是0,说明这个字符只占8位,这就还原Unicode的 [a] 了

  • 0000 0000 0000 0000 0110 0001

如何存字符

  • 编号,然后存编号

JS中的数据类型

7种(大小写无所谓)

  • 数字 number

  • 字符串 string

  • 布尔 bool

  • 符号 symber

  • 空 undefined

  • 空 null

  • 对象 object

总结: 四基两空一对象

以下不是数据类型

  • 数组、函数 日期

  • 它们都属于object

数字 number

写法

  • 整数写法:1

  • 小数写法: 0.1

  • 科学计数法: 1.23e4(1.23*10^4)

  • 八进制写法(用的少):0123或00123或者0o123

  • 十六进制写法: 0x3F 或 0X3F

  • 二进制写法:0b11 或者 0B11

特殊值

  • 正0 和 负0:

都等于0,要严谨(-0 = -0)

  • 无穷大:

Infinity、+Infinity、-Infinity

  • 无法表示的数字

NaN(Not a Number) (例如:0/0 = NaN)

但它是一个数字

64位浮点数

JS数字的存储形式

  • 浮点就是浮动的点,意思就是小数点会乱动

4.png

64位存储一个number

  • 符号占1位

  • 指数占11位(-1023~1024)

  • 有效数字占52位

范围和精度

范围(忽略符号位)

  • 指数拉满、有效数字拉满,得到最大二进制数字

  • Number.MAX_VALUE: 1.7976931348623157e+308

  • 指数负方向拉满、有效数字最小1,得到最小值

  • Number.MIN_VALUE: 5e-324

精度(有效数字)

  • 最多只能到52+1个二进制位表示有效数字

  • 2^53 对应的十进制是 9 后面 15 个零

  • 所以15位有效数字都能精确表示

  • 16位有效数字如果小于 90 开头,也能精确表示

  • 9110000000000001 就存不下来

字符串 string (每个字符两个字节)

写法

  • 单引号:'你好'

  • 双引号:"你好"

  • 反引号: 、、

注意:

  • 引号不属于字符串的一部分,就像书名号不属于书名的一部分一样

  • 如果要在单引号里面包含单引号怎么办?

转义

错误写法

  • 'it's ok'

  • JS 引擎会认为 'it' 就结束了,后面的看不懂

正确写法

  • 'it's ok' // 这就是转义

  • "it's ok"

  • 、it's ok、

用另一种写法表示你想要的东西

  • ' 表示 '

  • " 表示 "

  • \n 表示换行

  • \r 表示回车

  • \t 表示 tab 制表符

  • \ 表示 \

  • \uFFFF 表示对应的 Unicode 字符

  • \xFF 表示前 256 个 Unicode 字符

多种字符串

  • 如果想要在字符串里回车

let s = 、 用反引号很容易做到

字符串的长度

string.length

  • '123'.length // 3

  • '\n\r\t'.length // 3

  • ''.length // 0

  • ' '.length // 1

base 64 转码

window.btoa

  • 正常字符串为base 64 编码的字符串

window.atob

  • base 64 编码的字符串转为原来的字符串

  • 一般用来隐匿招聘启事里的简历

布尔 boolean (真或假)

只有两个值

  • true和false,注意大小写

下列运算会得到bool值

  • 否定运算

!value

  • 相等运算

1 == 2、1 != 2、3 === 4、3 !== 4

  • 比较运算

1 > 2、1 >= 2、3 < 4、3 <= 4

if配bool

  • if语句常常需要判断真假

f( value ) { ... } else { ... }

  • 如果 value 是 bool 值还好说

  • 如果 value 不是 bool 值咋办,谁真谁假

  • 1 是真还是假,0 是真还是假(真、假)

  • '1' 是真还是假,'0' 是真还是假(真、真)

五个falsy值

fasly就是相当于false,但又不是false的值,分别是:undefined 、null、 NaN、 ''

undefined和null两种空类型

  • 区别

  • 没有本质区别

细节一

如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null

细节二

如果一个函数,没有写 return,那么默认 return undefined,而不是 null

细节三

前端程序员习惯上,把非对象的空值写为 undefined,把对象的空值写为 null

符号symbol

  • 用的少

变量声明

三种声明方式

  • var a = 1

  • let a = 1

  • const a = 1

  • a = 1

区别

  • var 是过时的、不好用的方式

  • let 是新的,更合理的方式

  • const 是声明时必须赋值,且不能再改的方式

  • 最后这种方式是错误的,不准这样声明

let声明

规则

  • 遵循块作用域,即使用范围不能超出 { }

  • 不能重复申明

  • 可以赋值,也可以不赋值

  • 必须先声明再使用,否则报错

  • 全局声明的 let 变量,不会变成 window 的属性

  • for 循环配合 let 有奇效

const声明

规则

  • 跟 let 几乎一样

  • 只有一条不一样:声明时就要赋值,赋值后不能改

变量声明

  • 指定值

var a = 1

  • 同时也指定了类型

var a = 1

  • 但是值和类型都可以随意变化

a = 2

a = '字符串'

举例:name 和 'name' 的区别

name 是变量

  • 值可变,可能是 'name',也可能是 'hello'

'name' 是字符串常量

  • 常量就是不变量

  • 'name' 只能是 'name',不能是其他值

类型转化

number => string

  • String(n)

  • n + ''

string => number

  • Number(s)

  • parseInt(s) / parseFloat(s)

  • s - 0

x => bool

  • Boolean(x)

  • !!x

x => string

  • String(x)

  • x.toString()

5.png