JS数据类型

136 阅读2分钟

JS中的数据类型

数字number
字符串string
布尔bool
符号symbol
undefined
null
大整数bigint
对象object

数组、函数、日期不属于数据类型,它们属于object。

1. 数字 number

64位浮点数

写法

  • 整数写法:1
  • 小数写法:0.1
  • 科学计数法:1.23e4
  • 八进制写法:0123或00123或0o123
  • 十六进制写法:0x3F或0X3F
  • 二进制写法:0b11或0B11

特殊值

  • 正0 和 负0:都等于0,要严谨
  • 无穷大:Infinity、+Infinity、-Infinity
  • 无法表示的数字:NaN(Not a Number) ,但它是一个数字

JS数字的存储形式

  • 符号占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

每个字符两个字节

写法

  • 单引号:'你好'
  • 双引号:"你好"
  • 反引号:`你好` 引号不属于字符串的一部分,就像书名号不属于书名的一部分一样。

转义

  • \` 表示 `
  • \" 表示 "
  • \n 表示换行
  • \r 表示回车
  • \t 表示tab制表符
  • \\ 表示 \
  • \uFFFF 表示对应的Unicode字符
  • \xFF 表示前256个Unicode字符

多行字符串

字符串的长度

  • string.length
'123'.length // 3
'\n\r\t'.length // 3
''.length // 0
' '.length // 1

通过下标读取字符

  • string[index]
let s = 'hello';
s[0] // "h" 第一个字符

base64转码

  • window.btoa:正常字符串转为Base64编码的字符串
  • window.atob:Base64编码的字符串转为原来的字符串

3. 布尔 boolean

真或假,只有两个值,ture 和 false。

下列运算符会得到bool值

  • 否定运算:!value
  • 想等运算:1 == 21 != 23 === 43 !== 4
  • 比较运算:1 > 21 >= 23 < 43 <= 4
  • if 语句常常需要判断真假:if (value) {...} else {...}
  • 五个falsy值:falsy 就是相当于 false 但又不是 false 的值,分别是undefined null 0 NaN ''

4. undefined 和 null 两种空类型

区别

没有本质区别。

  • 细节一:如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是null。
  • 细节二:如果一个函数,没有写return,那么默认return undefined,而不是null。
  • 细节三:前端程序员习惯上,把非对象的空值写为undefined,把对象的空值写为null。

变量声明

三种声明方式

  • var a = 1 // 过时、不好用
  • let 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
  • x => bool
Boolean(x)
!!x
  • x => string
String(x)
x.toString()