JS数据类型

143 阅读4分钟

JS数据类型

数字与字符串

  • 都是1,为什么要分1和‘1’

  • 功能不同

    • 数字是数字,字符串是字符串,要严谨
    • 数字能加减乘除,字符串不行
    • 字符串能表达电话号码,数字不行
  • 存储形式不同

    • JS中,数字是用64位浮点数的形式存储的
    • JS中,字符串是用类似UTF8形式存储的(UCS-2)
如何存数字

将十进制转为二进制直接进行存储

如何存储字符

转成数字不就得了,但是注意,‘1’不能用1来表示

而是通过编码转为二进制再进行存储

UTF-8中的8的意思是 最少可用8位存一个字符

JS中的数据类型

  • 7种(大小写无所谓)

    • 数字 number
    • 字符串 string
    • 布尔 bool
    • 符号 symbol
    • 空 undefined
    • 空 null
    • 对象 object
    • 总结:四基两空一对象
  • 以下不是数据类型

    • 数组、函数、日期
    • 它们都属于object 是一种特殊的对象

数字 number

64位浮点数

写法

  • 整数写法 1

  • 小数写法 0.1

  • 科学计数法 1.23e4

  • 八进制写法 0123

  • 十六进制写法 0x3F

  • 二进制写法 0b11

  • 正0和负0 都等于0,但是在1/0时有区别

  • 无穷大 infinity、+Infinity、-Infinity

  • 无法表示的数字

    • NaN (Not a number)
    • 但它是一个数字
64位浮点数
  • JS数字的存储形式

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

image-20220801111301036.png

  • 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

每个字符两个字节(阉割版UTF8)

写法

  • 单引号
 '你好'
  • 双引号
 "你好"
  • 反引号
 `你好`
  • 注意

    • 引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
    • 如果要在单引号里面包括单引号怎么办呢
转义
  • 错误写法
 'it'sok'
 //js引擎会认为'it'就结束了,后面的看不懂
  • 正确写法
 'it's ok' //这就是转义
 "it'sok"
 `it'sok`
  • 用另一种写法表示你想要的东西就是转义
 ' 表示 '
 " 表示 "
 \n 表示换行
 \r 表示回车
 \t 表示制表符
 \ 表示 \
 \uFFFF表示对应的Unicode字符
 \xFF表示钱256Unicode字符
多行字符串
  • 如果你想要在字符串里回车 `` 反引号是能做到的

string .length可以读取字符串长度

string【index】可以通过下标读取字符串

base64转码
  • windows.btoa

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

    • 正常字符串转为Base64编码的字符串
  • 一般用来隐藏招聘启事里的简历邮箱

    • MTMzMjg3NTA5ODJAMTYzLmNvbQ==
  • 有时候也用来自欺欺人

    • 所谓的加密也就能骗过一部分外行

布尔 boolean

真或假

下列运算符会得到bool值

  • 否定运算

    • !value
  • 相等运算

    • 1 == 2、1! = 2、3 = == 4、3!== 4
  • 比较运算

    1>2、1>=2、3<4、3<=4

if配合bool
  • if语句常常需要判断真假

    • if(value){...}else{。。。}
  • 问题来了

    • 如果是value是bool值还好说
    • 如果value不是bool值怎么办,谁真谁假
    • 1是真还是假,0是真还是假
    • ‘1’是真还是假,'0'是真还是假
五个falsy值

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

分别是 undefined null 0 NaN ''

undefined 和 null 两种空类型

这是JS的原创之处

  • 没有本质区别

  • 细节一

    • 如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是null
  • 细节二

    • 如果一个函数,没有写return,那么默认返回return undefined,而不是null
  • 细节三

    • 前端程序员习惯上,把非对象的空值写为undefined,把对象的空值写为null
    • 但仅仅是习惯上而已

symbol

每个从 Symbol() 返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。

详细的可以参考文章:developer.mozilla.org/zh-CN/docs/…

变量声明

  • 三种变量声明

    • var a =1
    • let a=1
    • const a=1
  • 区别

    • var 是过时的、不好用的方式
    • let是新的,更合理的方式
    • const是声明时必须布置,且不能再更改的方式
  • var 变量提升

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.toStirng()