JS 的数据类型(除object类)

312 阅读2分钟

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

image.png

  • 64位存储一个 number
  • 符号占 1 位
  • 指数占 11 位(-1023~1024)
  • 有效数字占 52 位(开头的 1 省略)

范围和精度

  1. 范围(忽略符号位)
  • 指数拉满、有效数字拉满,得到最大二进制数字
  • Number.MAX_VALUE: 1.7976931348623157e+308
  • 指数负方向拉满、有效数字最小1,得到最小值
  • Number.MIN_VALUE: 5e-324
  1. 精度(有效数字)
  • 最多只能到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

真或者假

只有两个值
truefalse,注意大小写

否定运算
!value
相等运算
1 == 21 != 23 === 43 !== 4
比较运算
1 > 21 >= 23 < 43 <= 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 几乎一样
  • 只有一条不一样:声明时就要赋值,赋值后不能改(常量)

类型转换

  1. number => string
  • String(n)
  • n + '' 2.string => number
  • Number(s)
  • parseInt(s) / parseFloat(s)
  • s - 0
  1. x => bool
  • Boolean(x)
  • !!x
  1. x => string
  • String(x)
  • x.toString()