[JS全解]JS数据类型与运算
本文章资料主要来自饥人谷2020版前端体系课,本文为课程笔记
数据类型
数字与字符串
功能不同
- 数字是数字,字符串是字符串
- 数字可以进行加减乘除,字符串不可以
- 字符串可以表示电话号码,数字不可以
存储形式不同
- JavaScript中,数字使用64位浮点数形式存储
- 字符串使用类似UTF-8形式存储(UCS-2)
JavaScript如何存储数字
- 十进制转为二进制
- 用十六进制表示二进制
- 为什么要用十六进制?
- 二进制写起来太慢
- 计算器中程序员模式可以转换各种进制
- 其中HEX表示16进制,BIN表示2进制,OCT表示8进制,DEC表示10进制
- 二进制写起来太慢
- 为什么要用十六进制?
JavaScript如何存储字符
- 编号表示,用0-127表示所有符号,0为48号,A为65号,a为97号
- 以上编号只能存储英文字符
- 为了存储中文,推出中国国家标准局编号(国标2312),但是此标准不包括生僻字、繁体字、韩文等
- 微软为此推出一个扩展标准,简称GBK,兼容GB2312
- 国标局后推出GB18030来取代GBK,但此标准不兼容GB2312
- 但是GBK不包含泰文藏文等,为此推出万国码Unicode来解决所有需求
Unicode
- 优点
- 已收录13万字符(大于16位),全世界通用
- 可以继续扩充
- 缺点
- 每个字符需要三个及以上字节来存储
- 增大了文件体积
- 优点
UTF-8
- 使用Unicode来表示字符,使用UTF-8来存储
- UTF-8中8表示最少可用8位来存储一个字符
JavaScript中的数据类型
- 共七种
- Number
- String
- Boolean
- Symbol
- Null
- Undefined
- Object
- 数组、函数、日期属于Object类型
Number
JavaScript中使用64位浮点数存储数字
- 浮点为小数点可以移动
- 既123.456可以表示为1.23456e10^2
- 也可表示为12345.6e10^-2
- 64位存储一个数字
- 符号1位
- 指数11位(-1023 ~ 1024)
- 有效数字52位(数字开头的1可以省略,使用科学计数法表示)
- 浮点为小数点可以移动
范围
- Number.MAX_VALUE: 1.7976931348623157e+308
- Number.MIN_VALUE: 5e-324
精度
- 最多只能使用52+1个二进制位来表示有效数字
- 也就是15位及以下有效数字都可以精确表示
- 16位数字大于90开头,就不能有效表示(9110000000000001无法保存)
写法
- 整数写法
- 1
- 小数写法
- 0.1
- 科学计数法
- 1.23e4
- 八进制写法
- 0123或00123或0o123
- 十六进制写法
- 0x3F或0X3F
- 二进制写法
- 0b11或0B11
- 整数写法
特殊值
- +0与-0
- Infinity、-Infinity、+Infinity
- NaN
String
写法
- 单引号
- ‘a’
- 双引号
- “a”
- 模板字符串
- `a`
- 单引号
转义
- 如果需要在字符串中输入特殊符号,使用
\
进行转义- \uFFFF表示对应的Unicode字符
- \xFF表示前256个Unicode字符
- 如果需要在字符串中输入特殊符号,使用
属性
- string.length
- ‘123’.length // 3
- ‘\n\r\t’.length // 3
- ‘’.length // 0
- ‘ ‘.length // 1
- string.length
通过下标读取字符
- string[index]
- 下标从0开始计数
- string[index]
base64转码
window.btoa
- 将字符串转为base64格式编码的字符串
window.atob
- 将base64格式字符串转为原来的字符串
- 可以用来隐藏招聘启事里的简历信息
- 不要用于加密
Boolean
可以得出bool值的运算符
- 否定运算
- !
- 相等运算
- ==、!=、===、!==
- 比较运算
- >、>=、<、<=
- 否定运算
falsy
- undefined
- null
- 0
- NaN
- ‘’
undefined和null
- 区别
- 如果一个变量声明并没有赋值,那么会初始化为undefined
- 如果一个函数没有显式的return,会默认return undefined
- 习惯上将非对象空值写为undefined,对象空值写为null
Symbol
- 不常用
变量声明
三种显式的声明方式
- var
- let
- const
let
- 规则
- 创建新的块级作用域,既使用范围不会超出当前所在的{}
- 不能重复声明
- 可以赋值也可以不赋值
- 必须先声明后使用(TDZ暂时性死区)
- 使用let声明的全局变量,不会成为windows的属性
- 与for循环配合使用时,有奇效
const
- 声明时必须初始化,不能重新赋值
- 其余与let一样
js中,变量没有类型,变量的值有类型
类型转换
- Number => String
- String(n)
- n + ‘’
- String => Number
- Number(str)
- parseInt(str)/paresFloat(str)
- str - 0
- +str
- x => Boolean
- Boolean(x)
- !!x
- x => String
- String(x)
- x.toString()