JS中的数据类型
8种
number, string, bool, symbol, bigint, undefined, null, object
数组、函数、日期不是数据类型,属于object
number
写法
整数、小数、科学计数法1.23e4、八进制(0|00|0o开头)、16进制(0x或0X)、2进制(0b或0B)
特殊值
正0和负0
都是0
无穷大
Infinity +Infinity -Infinity
无法表示的数字
NaN
但NaN仍然是一个数字
0/0 => NaN
NaN != NaN
64位浮点数
js数字的存储形式
浮点就是浮动的点,意思就是小数点会乱动
123.456 可以表示为 1.23456e10^2
也可以表示为 12345.6e10^-2
64位存储一个number
正负号占1位, 指数占11位(-1023~+1024), 有效数字占52位(开头的1省略)
范围和精度
范围 指数拉满, 有效数字拉满, 得到最大二进制数字; 指数负方向拉满, 有效数字最小1, 得到最小值
Number.MAX_VALUE Number.MIN_VALUE
精度 (有效数字)
最多只能到52+1个二进制位表示有效数字, 2^53 对应的十进制是 9 后面 15 个零, 所以15位有效数字都能精确表示
16位有效数字如果小于 90 开头,也能精确表示
9110000000000001 就存不下来
string
每个字符两个字节(阉割版UTF-8)
写法
单引号, 双引号, 反引号
注意: 引号不属于字符串的一部分, 如果要在单引号里面包含单引号, 就需要用到转义
转义
'It's ok' JS引擎会认为'it'就结束了
正确写法: 'It's ok' 或 "It's ok" 或 `It's ok`
\' 表示 '
\" 表示 "
\n 表示换行
\r 表示回车
\t 表示 tab 制表符
\\ 表示 \
\uFFFF 表示对应的 Unicode 字符
\xFF 表示前 256 个 Unicode 字符
多行字符串
反引号
字符串的属性
后续讲
字符串的长度
string.length
'123'.length // 3
'\n\r\t'.length // 3
'\\\\\\'.length // 3
''.length // 0
' '.length // 1
通过下标读取字符
string[index] index从0到length
string[length] // undefined 不会报错
base64转码
window.btoa 正常字符串转为Base64编码的字符串
window.atob Base64编码的字符串转为原来的字符串
boolean
true和false
一些运算会得到bool值
否定运算 !value
相等运算 1 == 2、1 != 2、3 === 4、3 !== 4
比较运算 1 > 2、1 >= 2、3 < 4、3 <= 4
if 配 bool
if( value ) { ... } else { ... }
5个falsy值
undefined null 0 NaN ''
两种空类型 undefined null
没有本质区别
细节一: 如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null
细节二: 如果一个函数,没有写 return,那么默认 return undefined,而不是 null
细节三: 前端程序员习惯上,把非对象的空值写为 undefined,把对象的空值写为 null 但仅仅是习惯上而已
变量声明
指定值
var a = 1
同时也指定了类型
var a = 1
但是值和类型都可以随意变化
a = 2
a = '字符串'
三种声明方式
var a = 1
let a = 1
const a = 1
a = 1
区别
var 是过时的、不好用的方式
let 是新的,更合理的方式
const 是声明时必须赋值,且不能再改的方式
最后这种方式是错误的,不准这样声明
var方式
代码不要用var
var变量提升 wangdoc.com/javascript/…
let方式
规则
- 遵循块作用域,即 使用范围不能超出 { }
{
let b = 1
console.log(b)
}
console.log(b)
// 1
// Uncaught ReferenceError: b is not defined
- 不能重复声明
let a = 1
let a = 2
// Uncaught SyntaxError: Identifier 'a' has already been declared
-
可以赋值,也可以不赋值
-
必须先声明再使用,否则报错
{
console.log(b)
let b = 1
}
// Uncaught ReferenceError: Cannot access 'b' before initialization
- 全局声明的 let 变量,不会变成 window 的属性
var abc = 'abc'
console.log(window.abc)
// abc
let abc = 'abc'
console.log(window.abc)
// undefined
- for 循环配合 let 有奇效
const方式
常量(只读变量)
声明时就要赋值,赋值后不能改
类型转换
number => string
String(n)
n + ''
string => number
Number(s)
parseInt(s) / parseFloat(s)
s - 0
x => bool
Boolean(x)
!!x
!!1
// true
!!0
// false
x => string
String(x)
x.toString()
1.toString()
// Uncaught SyntaxError: Invalid or unexpected token
// js认为1.后面需要加数字
(1).toString()
1..toString()