JavaScript数据类型

119 阅读4分钟

JS共7种数据类型

  • number 数字
  • string 字符串
  • bool 布尔
  • symbol 符号
  • undefined 空
  • null 空
  • object 对象

四基,两空,一对象
(2020年6月JS新增了一种类型:bigint,详细:bigint_MDN,因为太新,目前使用太少,先不进行总结)
object对象相较于其他类型更为复杂,之后单独总结

number

几个特殊值

  • 正0和负0
    • 都等于0,只有一个情况下会有不同
    • 正负零区别.png
  • 无穷大
    • Infinity
    • +Infinity
    • -Infinity
  • 无法表示的数字
    • NaN 它无法用数字表示,但它是一个数字
    • NaN.png

JS数字的存储形式

JavaScript中数字是不区分整数值与浮点数值的,在JavaScript中所有的数均使用64位的浮点格式来存储和表示(IEEE 754标准)。

  • 浮点就是浮动的点,意为小数点可以移动
  • 如:123.456可表示为1.23456e10^2
  • 也可表示为12345.6e10^-2

JS数字存储.png

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

范围

  • 指数拉满,有效数字拉满,得到最大二进制数字
  • numbermaxvalue.png
  • 指数负方向拉满,有效数字最小1,得到最小值
  • numberminvalue.png

精度

  • 最多只能到52+1个二进制位表示有效数字
  • 2^53对应的十进制是9后面15个0
  • 所以15位有效数字都能精确表示
  • 16位有效数字如果小于90开头,也都能精确表示
  • 但9110000000000001就存不下来

string

写法

  • 单引号 ''
  • 双引号 ""
  • 反引号 `` (反引号里可以在字符串里加回车)

注意:
引号不属于字符串的一部分
怎么在单引号里包含单引号: 如:it's ok

  1. 'it's ok'
  2. 用其他的引号将其包裹住

字符串的长度

  • '123'.length 长度3
  • '\n\r\t'.length 长度3
  • '\\'.length 长度1
  • ''.length 长度0
  • ' '.length 长度1

通过下标读取字符

string[index] (index从0开始)

  • let s = 'hello'
  • s[0] ->"h"
  • s[5] ->undefined

base64转码

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

BASE转码.png

boolean

只有两个值 true 和 false ,注意大小写

下列运算符会得到bool值

  • 否定运算 !value
  • 相等运算 1==2,1!=2,3===4,3!==4
  • 比较运算 1>2,3<=4

五个falsy值

falsy就是相当于false但又不是false的值,分别是

  • undefined
  • null
  • 0
  • NaN
  • '' 除了这5个值,其他值都是真值

undefined和null

两个都是空类型,为什么有两个空?
我们也不知道JS之父是咋想的

区别

并没有本质区别

  • 如果一个变量声明了,但没有赋值,如var a那么默认a的值就是undefined,而不是null
  • 如果一个函数,没有写return,那么默认return undefined,而不是null

symbol

使用频率极低,
简单概括:Symbol 可以创建一个独一无二的值(但并不是字符串)
帮助理解->JS中的Symbol是什么?

其他补充

变量声明

指定值,同时也指定了类型,但是值和类型都可以随意变化
三种声明方式:

  • var a = 1
  • let a = 1
  • const a = 1 注意a = 1 不是声明,这个赋值

区别:

  • var目前已过时,存在很多BUG
  • let是更合理的方式(变量声明)
  • const是声明是必须赋值,且赋值后不能更改(常量声明)

我们先不谈var

let声明

规则:

  • 遵循块作用域,即使用范围不能超出{}
    • let遵循块.png
  • 同一作用域中不能重复声明
  • 可以赋值,也可以不赋值
  • 必须先声明再使用,否则报错
    • let先声明再使用.png
  • 全局声明的let变量,不会变成window的属性
    • let声明不变window属性.png
  • for循环配合let有奇效 如setTimeout的例子:
for (var i = 0; i < 5; i++) {
    setTimeout(()=>{
        console.log(i)
    }, 0)
}

这里打印出的内容是 5个5
我们已知for执行完后i的值是5,而setTimeout意思为过一段时间再执行,所以这段代码其实就能等到for执行完毕后,再打出i的值,而上述过程中for执行了5次,所以最后会打出5个5

而把这段代码的var改成let之后,打印出的内容才会是1,2,3,4

更深层次的理解->我用了两个月的时间才理解let

const声明

  • 跟let几乎一样
  • 区别点,声明时就要赋值,赋值后不能改
    • const值不能改.png
  • 不能配合for循环使用
    • const不能配合for.png

name和'name'的区别

  • name是变量
    • 类型不确定
    • 值可变,可能是name,也可能是hello
  • 'name'的字符串常量
    • 类型就是字符串
    • 'name'只能是'name',不能是其他值

类型转换

number => string

  • string(n)
    • JS的一个BUG
    • string bug.png
    • 数字过大会变为科学计数法
  • n+''

string => number

  • Number(s)
  • s - 0
  • praseInt(s)/parseFloat(s) 还可以变进制
    • parseInt.png

x => bool

  • Boolean(x)
    • boolean.png
  • !!x

x=> string

  • String(x)
  • x.toString()
    • JS的一个BUG,x不能是纯数字,否则会报错,要转换纯数字可以写成如下形式
    • toString BUG.png

JavaScript秘密花园

可以看到许多JS的奇葩BUG->JavaScript秘密花园