数字和字符串
- 1 和 ‘1’ 不同
存储形式不同
- JS中,数字是用64位浮点数的形式存储的
- 字符串是用类似 UTF8 形式存储的(UCS-2)
如何存数字
十进制转二进制
- 31(十进制)= 01111(二进制)
- 用2的次幂去找
二进制转十进制
- 转成二的N次幂加起来
用十六进制表示二进制
- 记住 8 4 2 1 对应 X X X X
- 从左往右每四位改写成一位
- HEX 表示 16进制,BIN 表示 2进制
- OCT 表示 8进制,DEC 表示 10进制
图片来源:饥人谷
如何存字符
用编号表示
- 0 表示结束字符
- 10 表示换行
- 13 表示回车
- 32 表示空格
- 33到47 表示标点
- 48到57 表示数字符号
- 65到90 表示大写字母
- 97到122 表示小写字母
- 127 表示删除键
怎么表示中文
- 中国国家标准局 编号:国标2312(16位两个字节)
- 微软退出了一个国标扩展,简称:GBK(繁体字、中日韩)
Unicode
- 优点
- 已收录13万字符(大于16位),全世界通用
- 以后还会继续扩充,不会停止
- 缺点
- 两字节不够用,每个字符要用三个及以上字节
- 所有文件扩大50%
JS中的数据类型
7种(第8种,BigInt)
- 数字 number
- 字符串 string
- 布尔 bool
- 符号 symbol
- 空 undefined
- 空 null
- 对象 object
- 总结:四基两空一对象
以下不是数据类型
- 数组、函数、日期
- 他们都属于 object
bool 值
- true or false
- 否定运算
!value
- 相等运算
- 1 == 2 、 1 != 2 、 3 === 4 、 3 !== 4
- 比较运算
- 1 > 2 、 1 >= 2 、 3 < 4 、 3 <= 4
- if 配 bool
- if(value){...}else{...}
- 注意
- 如果 value 是 bool 值还好说
- 如果 value 不是 bool 值
- 除了 falsy 值和 false 以外,其他都为真
- 五个 falsy 值
- undefined
- null
- 0
- NaN
- ''
undefined 和 null 两种空类型
- 区别 没有本质区别:
- 如果一个变量,但没有赋值,那么默认值就是 undefined,而不是 null
- 如果一个函数,没有写 return,那么默认 return undefined,而不是null
- 习惯上,把非对象的空值写为 undefined,把对象的空值写为 null
number (数字:64位浮点数)
- 整数写法
- 1
- 小数写法
- 0.1
- 科学计数法
- 1.23e4
- 八进制写法(用得少)
- 0123 或 00123 或 0o123
- 十六进制写法
- 0x3f 或 0X3F
- 二进制写法
- 0b11 或 0B11
特殊值
- 正0 和 负0
- 都等于0,要严谨
- 无穷大
- Infinity、+Infinity、-Infinity
- 无法表示的数字
- NaN(Not a Number)
64位浮点数
- 数字的存储形式
- 浮点就是浮动的点,意思就是小数点会乱动
- 123.456 可以表示为 1.23456e10^2
- 也可以表示为 12345.6e10^-2
- 64位存储一个 number
- 符号占 1 位
- 指数占 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
写法
- 单引号
- '你好'
- 双引号
- "你好"
- 反引号
你好
转义
- 用另一种写法表示你想要的东西
- \' 表示 '
- \" 表示 "
- \n 表示换行
- \r 表示回车
- \t 表示tab制表符
- \\ 表示 \
- \uFFFF 表示对应的 Unicode 字符
- \xFF 表示前 256 个 Unicode 字符
字符串的属性
- 字符串的长度
- '123'.length
- '\n\r\t'.length
- ''.length
- ' '.length
- 通过下标读取字符
- string[index]
let s = 'hello'; s[0] //"h" - 注意 index 从 0 开始
- 注意 index 到 length
let s = 'hello'
s[5] // undefined
s[4] // 'o'
symbol
基本上不怎么用
变量声明
三种声明方式
- var a = 1
- let a = 1
- const a = 1
- a = 1
区别
- var 是过时的、不好用的方式
- let 是新的,更合理的方式
- const 是声明时必须赋值,且不能再改的方式
- 最后这种方式 是错误的,不能这样声明
var 变量提升
let 声明
- 规则
- 遵循块作用域,即使用范围不能超出{}
- 不能重复声明
- 可以赋值,也可以不赋值
- 必须先声明再使用,否则报错
- 全局声明的 let 变量,不会变成 window 的属性
- for 循环配合 let 有奇效
const 声明
- 规则
- 跟 let 几乎一样
- 只有一条:声明时就要赋值,赋值后就不能改
变量声明
- 指定值
- var a = 1
- 同时也指定了类型
- var a = 1
- 但是值和类型都可以随意变化
- a = 2
- a = '字符串'
类型转换
number => string
- String(n)
- n + ''
string => number
- Number(s)
- parseInt(s) / parseFloat(s)
- s - 0
- +s
x => bool
- Boolean(x)
- !!x
x => string
- String(x)
- x.toString()
BigInt
- 是一种内置对象,用来表示大于
2^53 - 1的整数 - 不能用于
Math对象中的方法 - 不能和任何
Number实例混合运算,两者必须转换成同一类型,但是BigInt转成Number会丢失精度
简单记一下,后面再补充