一、JS中的数据类型
(一)类型:7种(大小写无所谓)
(1)数字 number
- 写法
- 整数写法:1
- 小数写法:0.1
- 科学计数法:1.23e4
- 八进制写法(用得少):0123 或 00123 或 0o123
- 十六进制写法:0x3F 或 0X3F
- 二进制写法 0b11 或 0B11
- 特殊值
- 正0 和 负0 都等于 0,但1/-0=-Infinity
- 无穷大:Infinity 、+Infinity 、-Infinity
- 无法表示的数字:NaN (Not a Number),如:0/0
- JS数字的存储形式: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 就存不下来
(2)字符串 string
- 写法
- 每个字符两个字节(阉割版 UTF8)
- 单引号:'你好'
- 双引号:"你好"
- 反引号:
`你好`
- 注意:引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
- 如果要在单引号里面包含单引号怎么办?
- 转义:用另一种写法表示你想要的东西
- 错误写法
'it's ok'
正确写法:
'it\'s ok' // 这就是转义
"it's ok"
`it's ok`
\' 表示 '
\" 表示 "
\n 表示换行
\r 表示回车
\t 表示 tab 制表符
\\ 表示 \
\uFFFF 表示对应的 Unicode 字符
\xFF 表示前 256 个 Unicode 字符
- 多行字符串
- 如果你想要在字符串里回车
let s = `这样是
可以的
用反引号很容易做到`
- 字符串的长度
- string.length
'123'.length // 3
'\n\r\t'.length // 3
''.length // 0 (空字符串)
' '.length // 1(有空格)
'\\\\\\'.length // 3
- 通过下标读取字符
- string[index]
let s = 'hello';
s[0] // "h"
- 注意 index 从 0 开始,s[0] 是第一个字符
- 注意 index 到 length
let s = 'hello';
s[5] // undefined,居然不报错
s[4] // 'o'
- base64 转码
- window.btoa:正常字符串转为 Base64 编码的字符串
- window.atob:Base64 编码的字符串转为原来的字符串
(3)布尔 bool
- 只有两个值,true 和 false 2.下列运算符会得到 bool 值
- 否定运算`!value`
- 相等运算`1 == 2、1 != 2、3 === 4、3 !== 4`
- 比较运算`1 > 2、1 >= 2、3 < 4、3 <= 4`
3.if 配 bool
- if 语句常常需要判断真假
if( value ) { ... } else { ... }4. 五个 falsy 值 - falsy 就是相当于 false 但又不是 false 的值
- 分别是
undefinednull0NaN''
(4)符号 symbol
1.用途:Symbol 可以创建一个独一无二的值(但并不是字符串)
(5) 空 undefined 和(6)空 null
- 区别:没有本质区别
- 细节一:如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null
- 细节二:如果一个函数,没有写 return,那么默认 return undefined,而不是 null
- 细节三:前端程序员习惯上,把非对象的空值写为 undefined,把对象的空值写为 null,但仅仅是习惯上而已
(7)对象 object(详见JS对象文章)
(8) 总结:四基两空一对象
数字 number
字符串 string
布尔 bool
符号 symbol
空 undefined
空 null
对象 object
以下不是数据类型
- 数组、函数、日期,它们都属于 object
二、变量声明
- 三种声明方式
var a = 1 (var 是过时的、不好用的方式)
let a = 1 (let 是新的,更合理的方式)
const a = 1(const 是声明时必须赋值,且不能再改的方式)
a = 1(错的方式)
- let 声明 规则:
- 遵循块作用域,即使用范围不能超出
{ } - 不能重复申明
- 可以赋值,也可以不赋值
- 必须先声明再使用,否则报错
- 全局声明的 let 变量,不会变成 window 的属性
- for 循环配合 let 有奇效
- const 声明 规则:
- 跟 let 几乎一样,只有一条不一样:声明时就要赋值,赋值后不能改
- 变量声明指定了值,同时也指定了类型,但是值和类型都可以随意变化
name和'name'区别
- name 是变量,值可变,可能是 'name',也可能是 'hello'
- 'name' 是字符串常量,常量就是不变量,'name' 只能是 'name',不能是其他值
三、类型转换
- 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()