JS的数据类型
基本类型:
- string(字符串)
- boolean(布尔值)
- number(数字)
- symbol(符号)
- null(空值)
- undefined(空值)
- bigint(新增) 复杂类型:
- object(对象) 总结:“四基两空一对象”,还有一个是bigint是新增的
注意:数组,函数,日期都属于object
1.数字 number
数字的特殊值有:
-
0,正0、负0
-
无穷大 Infinity、正无穷大+Infinity、负无穷大-Infinity
-
无法表达的数字 —— NaN
但是输入NaN===NaN,会出现false。因为两个无法表达的数字不相等
数字的存储形式
JS中,数字是用64位浮点数的形式存储的。(二进制)
其中指数部分有11位,范围从-1023到+1024,有效数字有 52 位,需要省略开头的 1 。
例如:0.5的存储方式是 0|-1|0 。
精度(有效数字)
最多只能是 52+1 个二进制位表示有效数字,对应的十进制是9后面15个0。
15位有效数字都能精确表示,16位有效数字如果小于等于90开头,也能精确表示。
0.1 + 0.2 为什么不等于 0.3 ?
- 原因:
JS的精确度区间 约为正负 2^53,超出限制会截断。所以你看到的 0.1 不是真的 0.1。
计算机无法识别十进制,JS会将十进制转换为对应的二进制(二进制即:0 和 1)。
0.1和0.2在转换成二进制后会无限循环,由于标准位数的限制后面多余的位数会被截掉,此时就已经出现了精度的损失,相加后因浮点数小数位的限制而截断的二进制数字在转换为十进制就会变成0.30000000000000004。
2.字符string
写法
单引号 'hi'
双引号 "hi"
反引号 ``
引号不属于字符串的一部分
转义
例如 'it's tree' ,JS引擎会认为 'it' 就结束了。
正确写法
转义: 前面加斜杠 \ ,例如 'it\'s tree'
外面用双引号: "it's tree"
外面用反引号 `it's tree`
转义——用另一种写法表示你想要的东西
' —— ' 单引号
" —— " 双引号
\n —— 换行
\r —— 回车
\t —— tab 制表符
\ —— (斜杠)
\uFFFF —— 对应的Unicode 字符
\xFF —— 前 256 个Unicode 字符
多行字符串:外面用反引号
字符串长度
string.length —— 即可看见字符串string的长度
例如:'\n\r\t'.length //值为3
通过下标可以读取字符(类似数组)
例如:let s='hello';s[0] //值为"h"
读取是从0位数开始
base64转码
- window.btoa(字符串)—— 正常字符串转为Base64编码的字符串
- window.atob(字符串) —— Base64编码的字符串转为原来的字符串
3.布尔bool
只有两个值 true 和 false
经常用 if语句 配 bool —— if(value){...}else{...}
但是 value不是bool属性怎么办?
五个 falsy 值
undefinednull0NaN''(空字符串)
这五个 falsy 值代表假的。(还有false)
4.undefined和null
undefined 和 null 是两种空类型,区别如下:
- 声明变量但是没有赋值,默认值是undefined,不是null
- 函数没有return,那么默认return undefined,而不是 null
- 习惯上,非对象的空值写为undefined,把对象的空值写为 null
5.Symbol
Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名
Symbol 数据类型的特点是唯一性,即使是用同一个变量生成的值也不相等。
总结:Symbol 生成一个全局唯一的值。
6.BigInt
BigInt是一种新的数据类型,用于当整数值大于Number数据类型支持的范围时。这种数据类型允许我们安全地对大整数执行算术操作,表示高分辨率的时间戳,使用大整数id,等等,
JS中number类型只能安全的表示-9007199254740991(-(2^53-1))和9007199254740991((2^53-1)) 任何超出此范围的整数值都可能失去精度。
1.要创建BigInt,只需要在数字末尾追加n即可。
\
2.创建BigInt的方法是用BigInt()构造函数
变量声明
三种声明方式:
- var a=1
- let a=1
- const a=1
let 是新的更合理的方式,可声明局部变量。const 声明是必须赋值,且不能再更改。
let 声明和const 声明
相同点
-
遵循块作用域,使用范围不超出{}
-
不能重复声明
-
可以赋值也可以不赋值
-
必须先声明才能使用
-
全局声明的let属性,不会变成window 的属性
不同点
const 声明与let声明几乎一样,但是必须要赋值
类型转换
number=> string
- String(number)
- number +
''(空字符串)
如图,加号有用,减号没用
stringr=> number
- Number(s)
- parseInt(s)
- s-0
如图,减号有用,加号没用
x => bool
- Boolean(x)
- !!x
x => string
- String(x)
- x.toString()