数据类型
数据为什么需要类型
数字与字符串
都是一,为什么要分 1 和 '1'
功能不同
- 数字是数字,字符串是字符串,要严谨
- 数字能加减乘除,字符串不行
- 字符串能表示电话号码,数字不行
存储形式不同
- JS 中,数字是用64位浮点数的形式存储的
- JS中,字符串使用类似UTF8形式存储的(UCS-2)
ASCII码:48=0 65=A 97=a
JS中的数据类型
七种(大小写无所谓)
- 数字 number
- 字符串 string
- 布尔 bool
- 符号 symbol
- 空 undefined
- 空 null
- 对象 object
- bigint(2020年新增类型)
- 总结:四基本两空一对象
以下不是数据类型
- 数组、函数、日期
- 它们都属于object
数字number
number在js中由64位浮点数组成
写法
- 整数写法:1
- 小数写法:0.1
- 科学计数法:1.23e4
- 八进制学法(用得少):0123 或 00123 或 0o123
- 十六进制写法:0x3F 或 0X3F
- 二进制写法:0b11 或者 0B11
特殊值
- 正 0 和 负 0:都等于0,要严谨
- 无穷大:Infinity、+Infinity、-Infinity
- 无法表示的数字:NaN(Not a Number),但是它是一个数字
64位浮点数
JS数学的存储形式
- 浮点就是浮动的点,意思就是小数点会乱动
- 123.456 也可以表示位 1.23456e102,还可以表示为 12345.6e10-2
64位存储一个 number
- 符号占一位
- 指数占11位(-1023~1024)
- 有效数学占 52 位(开头的 1 省略)
范围和精度
范围(忽略符号位)
- 指数拉满,有效数字拉满,得到最大二进制数字
- Number.MAX_VALUE: 1.7976931348623157e+308
- 指数负方向拉满、有效数字最小1,得到最小值
- Number.MIN_VALUE:5e-324
精度(有效数字)
- 最多只能到52+1个二进制位表示有效数字
- 2^53对应的十进制是9后面15个零
- 所以15位有效数字都能精确表示
- 16位有效数字如果小于90开头,也能精确表示,但是如果是9110000000000001 就存不下来了
字符串String
每个字符两个字节(阉割版UTF8)
写法
- 单引号:'你好'
- 双引号:"你好"
- 反引号:
你好
- 注意:引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
- 如果要在单引号里面包含单引号怎么办?
转义
用另一种写法表示你想要的东西
- 错误写法:'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 //可获取字符串的长度
'\n\t\r'.length //长度是3
通过下标读取字符
- string[index],注意index从0开始,注意index 到 length。
base64编码
加密:window.btoa("123"),解码:window.atob("MTIz")
- window.btoa ,正常字符串转为base64编码的字符串
- window.atob, Base64编码的字符串转为原来的字符串
- 一般用来隐藏招聘启事里面的邮箱:Nzg1ODc5OTg2QHFxLmNvbQ==
布尔boolean
下列运算符会得到bool值
- 否定运算:!value
- 相等运算:1==2、1 != 2、 3===4、3 !== 4
- 比较运算:1 > 2 、1 >= 2、3 < 4、 3 <=4
if 配 bool
- if语句常常需要判断真假:if(value) else
- 问题来了:如果value 是 bool 值还好说,如果value不是bool值咋办
- 1 是真还是假,0 是真还是假,'1' 是真还是假,'0'是真还是假
JS有五个 falsy 值,falsy 就是相当于 false但又不是false的值,分别是 undefined 、null 、0 、NaN 、''。
再加上false 就一共是六个假值
'' 和 ' ' 不是一个玩意,保持严谨
undefined 和 null 两种空类型
这是是JS的原创,也是垃圾的地方。
区别
- 没有本质区别
- 细节一:如果一个变量声明了,但是没有复制,那么默认值就是undefined,而不是null
- 细节二:如果一个函数,没有写return,那么默认return undefined,而不是null
- 细节三:前端程序员习惯上,把非对象的空值写为undefined,把对象的空值写为 null(但这只是习惯)
变量声明
三种声明方式
- var a = 1
- let a = 1
- const a = 1
- a = 1(错误的)
区别
- var 是过时的、不好用的方式
- let 是新的,更合理的方式
- const 是声明时必须赋值,且不能再改的方式
- 最后这种方式是错误的,不能这样声明
TODO:var 有个变量提升的概念
let声明
规则
- 遵循块作用域,使用范围不能超出{}
- 同一个{}中不能重复声明
- 可以赋值,也可以不赋值
- 必须先声明在使用,否则报错
- 全局声明的let变量,不会变成window 的属性
- for循环配合let 有奇效
const声明
规则:跟let几乎一样,声明时必须马上赋值,而且后续不能再改变这个值。
变量声明的同时指定了值,同时也指定了类型,但是值和类型都可以随意变化
let a = 1
a = 2
a = '字符串'
name 和 'name' 的区别:存的地方不一样,字符串存在stack区。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()
总结
六种类型:undefined、null、number、string、bool、symbol
这些都是简单类型,只有object叫做复杂类型