JavaScript数据类型

143 阅读6分钟

仅作为学习总结笔记,随着知识的积累和技术的发展随时可能会修改

数据类型简介

  • 如果想了解JS奇奇怪怪的bug 可以搜索一下JavaScript秘密花园

数字和字符串区别

  • 问:都是1,为什么要分1和'1'

功能不同

  • 数字和字符串完全不同,要严谨

  • 数字能加减乘除,字符串不行

  • 字符串能表示电话号码等,数字不行

存储形式不同

  • JS中,数字是用64位浮点数形式存储的

  • 而字符串使用类似UTF-8的形式存储的(UCS-2)

如何存数字

  • 十进制转二进制即可

1. 十进制转二进制

  • 31 变成二进制 31 = ? × 2的五次方  +  ? × 2四次方  +  ? × 2三次方 +  ? × 2二次方 +  ? × 2一次方 +  ? × 2零次方

  • 经过一番尝试 得出答案: 31 = 1 × 2的五次方  +  1 × 2四次方  +  1 × 2三次方 +  1 × 2二次方 +  1 × 2一次方 +  1 × 2零次方

  • 所以31(十进制)= 01111(二进制)

  • 不是套公式,程序员不套公式,多尝试比较重要

2. 二进制转十进制

  • 100011 变成十进制

  • 每一位乘二的位数平方(从右往左数),加起来即可

  • 100011= 2∧5+2∧1+2∧0 = 35

3. 用十六进制表示二进制

  • 为什么用16进制?

    1. 因为二进制写起来太慢了:011110001011010

    2. 记住8 4 2 1 对应 x x x x

    3. 从右往左每四个数字写成一位,011=3/1100=12/0101=5/1010=10

    4. 得到了3,12,5,10,把大于9的数字改为A B C D E F

    5. 于是得到了3C5A,也可以用计算器中的程序员模式进行换算

    • HEX是16进制、OCT是8进制、DEC是10进制、BIN是2进制

如何存字符

  • 转换成数字再存,但注意'1' 不能用数字1来表示

  • 如何存储a、b、c和1、2、3,简单、直接编号来表示他们就行

美国人编了个号

f4b385956e1d90bb6eef5148c569fde.png

  • 其中重要的需要记下来

  • 数字0用48表示,小写a用97表示,大写A用65表示

中国人用电脑后,中文由国标局编号【国标2312】

e45a26ae9dd21bfa5d69e5f6b0d2300.png

  • 刚开始只有2000多个中文和日文被收录进去,生僻字、繁体字、韩文忘了编进去

  • 后来微软推出了GBK国标扩,含21886个汉子和图形符号

c01a7fe663b5010015050833d3a8251.png

  • 但是泰文,藏文等语言还是显示不了,于是又开始继续编,一次满足世界所有需求

unicode万国码

  • 优点:已收录13万字符(大于16位),以后还会继续扩充,不会停止,全世界通用

  • 缺点:两个字节不够用,每个字符需要三个或以上字节,所有文件扩大50%,不划算

解决unicode存储扩大问题

  • 用unicode,但存储时偷懒

70ad0bbc25ed269efeae6b9627aa276.png

于是UTF-8被发明出来了

JS中的数据类型

简介

  • 七种(大小写无所谓)

    1. 数字 number

    2. 字符串 string

    3. 布尔 bool

    4. 符号 symbol

    5. undefined

    6. null

    7. 对象 object

  • 四基两空一对象

  • 前六种是简单类型数据,对象是复杂类型数据

以下不是数据类型

  • 数组、函数、日期等

  • 它们都属于object

1、数字 number

写法

  1. 整数写法: 1

  2. 小数写法: 0.1

  3. 科学计数法: 1.23e4

  4. 八进制写法:0123或00123

  5. 十六进制写法:0x3F或0X3F

  6. 二进制写法:0B11或0b11

  • 后三种用的很少,主要记住前三种

特殊值

  • 正0和负0:都等于0,但是符号不同,要严谨

  • 无穷大:infinity+ infinity- infinity

  • 无法表示的数字:NaN(Not a Number)但它是一个数字

64位浮点数

1. JS数字的存储形式

  • 浮点就是浮动的点,意思就是小数点可以移动

  • 123.456可以表示为1.23456e10∧2

  • 也能表示为 12345.6e10∧-2

2. 64位存储一个number

a01297a640d678195592cd9a5ae5756.png

  • 符号占一位

  • 指数占11位(-1023~1024)

  • 有效数字占52位(省略掉开头的1)

3. 范围和精度

f42c3b0dadcaa48a03001536d329713.png

  • 范围:

    1. number.max_VALUE:得到最大数字

    2. number.min_VALUE:得到最小数字

  • 精度:

    1. 90后面15个零都可以存,但超过16个零就不行了

    2. 现在JS出了一个新的数据类型可以解决这个问题bigint需要的时候搜MDN

2、字符串 string

  • 每个字符两个字节(阉割版UTF-8)

1、写法

  • 单引号: '你好'

  • 双引号: "你好"

  • 反引号: `你好`

2、注意

  • 引号不属于字符串的一部分

  • 引号内如果要包含引号,请用转义

转义

  • 错误写法

    • 'it's ok'

    • JS引擎会以为'it'就结束了,后面它就不管了

  • 正确写法

    • it\'s ok' 这样就是转义

    • "it's ok" 或 `it's ok` 交替使用符号,可以让JS引擎知道你想表达什么

  • 转义就是用另种写法表示你想要的东西

    • ' 表示 '

    • " 表示 "

    • \n 表示 换行

    • \r 表示 回车

    • \t 表示 tab制表符

    • \ 表示 \

    • \UFFFF 表示对应的unicode字符

    • \xFF 表示前256个unicode字符

多行字符串

  • let s = `这样是
    可以的
    用反引号很容易做到`
    
  • 以前没有反引号的时候,想实现就很麻烦,双引号和单引号实现不了这种效果

  • 字符串的属性

字符串长度

  • string.length

    • '123'.length // 3

(特 别 注 意) 空格不代表没有,空字符串和空格字符串不是一个东西

通过下标读取字符

  • string[index]

    • let s = 'hello'

    • s[0] //h

  • 注意index从零开始

    • s[0]是第一个字符
  • 注意indexlength的转换

    • let s = 'hello'

    • s[5] // undefined

    • s[4] // 'o'

base 64转码

image.png

  • window.btoa

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

    • Base64编码转为正常字符串
  • 一般用来隐藏招聘信息里的简历

  • 有时候也用来给入门程序员装逼,骗一部分外行

3. 布尔值 boolean

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

下列运算符会得到bool值

  1. 否定运算:!value

  2. 相等运算:1==21!=23===43!==4

  3. 比较运算:1>21<=23<43<=4

补充

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

    • if(value){...}else{...}
  • 问题

    • 如果value是bool,一切正常

    • 如果value不是bool,那就看是否为falsy值

  • falsy值

    • falsy相当于false,但又不是false的值
  • 五个falsy值

    1. undefined

    2. null

    3. 0

    4. NaN

    5. '' 空字符串

4、undefinednull 两种空类型

  • 为什么有两个空值

    • 因为这时JS原创之处,对比其他语言,这就是它的垃圾之处

区别(没啥本质区别)

  1. 如果一个变量声明了,但没有赋值,那默认就是undefined,不是null

  2. 如果一个函数没写return,那默认returnundefined,不是null

  3. 前端程序员习惯上,把非对象空值写为undefined,把对象空值写为null

  • 但也仅仅只是习惯而已

变量声明

三种方式

  1. var a = 1

  2. let a = 1

  3. const a = 1

  4. a = 1 这种是错误的声明方式,它不是声明全局变量

区别

  • var是过时的,不好用的方式,let是新的更合理的方式

  • const是声明时必须赋值,且不能再改的方式,改或者不赋值会报错

  • 以后尽量都用constlet声明变量,var有很多不合理之处

  • var 等到面试前再学习,反正写代码也不用 var

1. let 声明

  • 规则

    1. 遵循块作用域,即使用范围不能超过{}

    2. 不能重复申明

    3. 可以赋值,也可以不赋值

    4. 必须先声明再使用,否则报错

    5. 全局声明的let变量,不会变成window的属性,var就会

    6. for循环配合let有奇特的效果

2. const 声明

  • 规则

    1. let几乎一样

    2. 唯一不同是:声明时就要赋值,赋值后不能更改,所以也叫常量

变量声明规则

  • 指定值

    • let a = 1 a的值是1
  • 同时也指定了类型

    • let a = 1 a里值的类型是 number
  • 但是指的类型可以随意变化

    • a = 2 和 a = '字符串'

name'name'的区别

  1. name是变量
  • 值可以变,可能是'name'可能是'hello'
  1. 'name'是字符串常量
  • 常量就是不变量

  • 'name'只能是'name',不能是其他值

数据类型转换

1.number => string 数字转字符串

  • String(n)

  • n + ''(空字符串) 这个方法是最常用的

2.string=>number 字符串转数字

  • Number(s)

  • parseInt(s)或者parseFloat(s) 现在不需要在s后面加10也能达到转换效果,JS引擎升级了

  • s - 0 最常用的方法 + s也能变成number

3. x => bool 把任何值变成布尔

  • Boolean(x)

  • !!1或!!0或!!x

4. x=>string 把任何值转成字符串

  • String(x)

  • x.toString() 如果x为数字那么x需要加括号,否则会报错,因为js引擎有点傻