JS 中的数据类型
7种(大小写无所谓)
- 数字 number
- 字符串 string
- 布尔 bool
- 符号 symbol
- 空 undefined
- 空 null
- 对象 object
总结:四基两空一对象
以下不是数据类型
- 数组、函数、日期
- 它们都属于 object
数字number
JS 的 number 全都是以小数(浮点数)的形式存储的,没有单独的整数
写法
- 整数写法
- 1
- 小数写法
- 0.1
- 科学计数法
- 1.23e4
- 八进制写法(用得少)
- 0123 或 00123 或 0o123
- 十六进制写法
- 0x3F 或 0X3F
- 二进制写法
- 0b11 或 0B11
特殊值
- +0 和 -0
- 都等于 0,要严谨
- 无穷大
- Infinity 、+Infinity 、-Infinity
- 无法表示的数字
- NaN (Not a Number)
但它是一个数字
64位浮点数
- JS数字的存储形式
- 浮点就是浮动的点,意思就是小数点会乱动
- 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
每个字符两个字节
写法
- 单引号
- '你好'
- 双引号
- "你好"
- 反引号
- `你好`
- 使用反引号可以在字符串里写回车
let s = `这样是
可以的
用反引号很容易做到`
转义
用另一种写法表示你想要的东西
\'表示'\"表示"\n表示换行\r表示回车\t表示 tab 制表符\\表示\\uFFFF表示对应的 Unicode 字符\xFF表示前 256 个 Unicode 字符
字符串的属性
string.length
'123'.length // 3
'\n\r\t'.length // ?
''.length // 0
' '.length // 1
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 编码的字符串转为原来的字符串
布尔 boolean
真或者假
只有两个值
true 和 false,注意大小写
否定运算
!value
相等运算
1 == 2、1 != 2、3 === 4、3 !== 4
比较运算
1 > 2、1 >= 2、3 < 4、3 <= 4
五个 falsy 值
falsy 就是相当于 false 但又不是 false 的值
分别是
undefined null 0 NaN ''
&&短路逻辑
A && B && C && D 返回第一个判断为假的值或D(不会返回true/false)
||短路逻辑
A || B || C || D 返回第一个判断为真的值或D(不会返回true/false)
undefined 和 null 两种空类型
区别
没有本质区别
细节一
- 如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null 细节二
- 如果一个函数,没有写 return,那么默认 return undefined,而不是 null 细节三
- 前端程序员习惯上,把非对象的空值写为 undefined,把对象的空值写为 null 但仅仅是习惯上而已
symbol 符号
很少用
参考这篇文章:
zhuanlan.zhihu.com/p/22652486
变量声明
三种声明方式
var a = 1
let a = 1
const a = 1
a = 1
区别
- var 是过时的、不好用的方式
- let 是新的,更合理的方式
- const 是声明时必须赋值,且不能再改的方式
- 最后一种方式是错误的,不准这样声明
let声明规则
- 遵循块作用域,即使用范围不能超出 { }
- 不能重复申明
- 可以赋值,也可以不赋值
- 必须先声明再使用,否则报错
- 全局声明的 let 变量,不会变成 window 的属性
- for 循环配合 let 有奇效
const声明规则
- 跟 let 几乎一样
- 只有一条不一样:声明时就要赋值,赋值后不能改(常量)
类型转换
- number => string
String(n)n + ''2.string => numberNumber(s)parseInt(s) / parseFloat(s)s - 0
- x => bool
Boolean(x)!!x
- x => string
String(x)x.toString()