JS共7种数据类型
- number 数字
- string 字符串
- bool 布尔
- symbol 符号
- undefined 空
- null 空
- object 对象
四基,两空,一对象
(2020年6月JS新增了一种类型:bigint,详细:bigint_MDN,因为太新,目前使用太少,先不进行总结)
object对象相较于其他类型更为复杂,之后单独总结
number
几个特殊值
- 正0和负0
- 都等于0,只有一个情况下会有不同
- 无穷大
- Infinity
- +Infinity
- -Infinity
- 无法表示的数字
- NaN 它无法用数字表示,但它是一个数字
JS数字的存储形式
JavaScript中数字是不区分整数值与浮点数值的,在JavaScript中所有的数均使用64位的浮点格式来存储和表示(IEEE 754标准)。
- 浮点就是浮动的点,意为小数点可以移动
- 如:123.456可表示为1.23456e10^2
- 也可表示为12345.6e10^-2
- 符号占1位
- 指数占11位(-1023~1024)
- 有效数字占52位(开头的1省略)
范围
- 指数拉满,有效数字拉满,得到最大二进制数字
- 指数负方向拉满,有效数字最小1,得到最小值
精度
- 最多只能到52+1个二进制位表示有效数字
- 2^53对应的十进制是9后面15个0
- 所以15位有效数字都能精确表示
- 16位有效数字如果小于90开头,也都能精确表示
- 但9110000000000001就存不下来
string
写法
- 单引号 ''
- 双引号 ""
- 反引号 `` (反引号里可以在字符串里加回车)
注意:
引号不属于字符串的一部分
怎么在单引号里包含单引号:
如:it's ok
- 'it's ok'
- 用其他的引号将其包裹住
字符串的长度
'123'.length长度3'\n\r\t'.length长度3'\\'.length长度1''.length长度0' '.length长度1
通过下标读取字符
string[index] (index从0开始)
let s = 'hello's[0]->"h"s[5]->undefined
base64转码
window.btoa- 正常字符转为Base64编码字符
window.atob- Base64编码的字符串转为原来的字符串
boolean
只有两个值 true 和 false ,注意大小写
下列运算符会得到bool值
- 否定运算 !value
- 相等运算 1==2,1!=2,3===4,3!==4
- 比较运算 1>2,3<=4
五个falsy值
falsy就是相当于false但又不是false的值,分别是
- undefined
- null
- 0
- NaN
- '' 除了这5个值,其他值都是真值
undefined和null
两个都是空类型,为什么有两个空?
我们也不知道JS之父是咋想的
区别
并没有本质区别
- 如果一个变量声明了,但没有赋值,如
var a那么默认a的值就是undefined,而不是null - 如果一个函数,没有写return,那么默认return undefined,而不是null
symbol
使用频率极低,
简单概括:Symbol 可以创建一个独一无二的值(但并不是字符串)
帮助理解->JS中的Symbol是什么?
其他补充
变量声明
指定值,同时也指定了类型,但是值和类型都可以随意变化
三种声明方式:
var a = 1let a = 1const a = 1注意a = 1不是声明,这个赋值
区别:
- var目前已过时,存在很多BUG
- let是更合理的方式(变量声明)
- const是声明是必须赋值,且赋值后不能更改(常量声明)
我们先不谈var
let声明
规则:
- 遵循块作用域,即使用范围不能超出{}
- 同一作用域中不能重复声明
- 可以赋值,也可以不赋值
- 必须先声明再使用,否则报错
- 全局声明的let变量,不会变成window的属性
- for循环配合let有奇效 如setTimeout的例子:
for (var i = 0; i < 5; i++) {
setTimeout(()=>{
console.log(i)
}, 0)
}
这里打印出的内容是 5个5
我们已知for执行完后i的值是5,而setTimeout意思为过一段时间再执行,所以这段代码其实就能等到for执行完毕后,再打出i的值,而上述过程中for执行了5次,所以最后会打出5个5
而把这段代码的var改成let之后,打印出的内容才会是1,2,3,4
更深层次的理解->我用了两个月的时间才理解let
const声明
- 跟let几乎一样
- 区别点,声明时就要赋值,赋值后不能改
- 不能配合for循环使用
name和'name'的区别
- name是变量
- 类型不确定
- 值可变,可能是name,也可能是hello
- 'name'的字符串常量
- 类型就是字符串
- 'name'只能是'name',不能是其他值
类型转换
number => string
- string(n)
- JS的一个BUG
- 数字过大会变为科学计数法
- n+''
string => number
- Number(s)
- s - 0
- praseInt(s)/parseFloat(s) 还可以变进制
x => bool
- Boolean(x)
- !!x
x=> string
- String(x)
- x.toString()
- JS的一个BUG,x不能是纯数字,否则会报错,要转换纯数字可以写成如下形式
JavaScript秘密花园
可以看到许多JS的奇葩BUG->JavaScript秘密花园