数字与字符串
问:都是一,为什么要分 1 和 "1"
功能不同
-
数字是数字,字符串是字符串,要严谨
-
数字能加减乘除,字符串不行
-
字符串能表示电话号码,数字不行
存储形式不同
-
JS中,数字是用64位浮点数的形式存储的
-
JS中,字符串是用类似UTF-8形式存储的(UCS-2)
如何存数字
十进制转二进制即可
二进制
10转2
-
31变成二进制
-
尝试后得到:31(十进制)=011111(二进制)
2转10
-
100011变成十进制
-
每一位乘以2的N次方,然后加起来
-
100011=2^5+2^1+2^0=35
用十六进制表示二进制
为什么用十六进制?
-
因为二进制写起来太慢了:011110001011010
-
记住 8 4 2 1 对应 x x x x
-
从右往左每四位改写成一位:011110001011010
-
得到 3 , 12 , 5 , 10 ;把大于9的数字改为 A B C D E F
-
于是得到 3C5A ,你也可以用计算器的程序员模式
HEX表示16进制;BIN表示2进制
OCT表示8进制,DEC表示10进制
如何存字符
转成数字不就得了,但是注意,'1' 不能用 1 来表示
如何存储 a b c 1 2 3(答:编号表示)
- 用 0~127 表示所有的符号
注意: 0用48表示,A用65表示,a用97表示
怎么表示中文?
简单,编号,中国国家标准局来编,名称【国家2312】
怎么表示生僻字、繁体字、韩文呢?
- 微软推出了一个国际扩展,简称GBK
显示不了藏文,泰文怎么办?
-
继续编号
-
万国码(Unicode)
Unicode
优点
-
已收录13万字符(大于16位),全世界通用
-
以后还会继续扩充,不会停止
-
最新版只添加了一个字——令和的合体字
缺点
-
两个字节不够用,每个字符要用三个及以上字节
-
这样所有文件都扩大50%,不划算
虽然用Unicode,但存的时候偷懒,于是:UTF-8就被发明出来了。
存储 [a]
-
a对应的Unicode编号为97,十六进制61
-
Unicode直接存:0000 0000 0000 0000 0110 0001
-
UTF-8 偷懒存法: 0110 0001
-
三字节变一字节,比GBK还省
存储 [你]
-
你对应的Unicode编号为4F60
-
Unicode直接存:0000 0000 0100 1111 0110 0000
-
UTF-8 偷懒存法:1110 0100 1011 1101 1010 0000
-
还是三字节,没有省,但是字母都能省一点
UTF-8 中的8的意思是
- 最少可用8位存一个字符
UTF-8 的规则
以 [你a] 为例
1110 0100 1011 1101 1010 0000 0110 0001
-
读8位信息1110 0100
-
发现开头有3个1,说明这个字符有3个八位
-
于是再读两个8位信息 1011 1101和1010 0000
-
这就还原为Unicode 的 [你]
-
0000 0000 0100 1111 0110 0000
-
再读8位信息 0110 0001
-
发现开头是0,说明这个字符只占8位,这就还原Unicode的 [a] 了
-
0000 0000 0000 0000 0110 0001
如何存字符
- 编号,然后存编号
JS中的数据类型
7种(大小写无所谓)
-
数字 number
-
字符串 string
-
布尔 bool
-
符号 symber
-
空 undefined
-
空 null
-
对象 object
总结: 四基两空一对象
以下不是数据类型
-
数组、函数 日期
-
它们都属于object
数字 number
写法
-
整数写法:1
-
小数写法: 0.1
-
科学计数法: 1.23e4(1.23*10^4)
-
八进制写法(用的少):0123或00123或者0o123
-
十六进制写法: 0x3F 或 0X3F
-
二进制写法:0b11 或者 0B11
特殊值
- 正0 和 负0:
都等于0,要严谨(-0 = -0)
- 无穷大:
Infinity、+Infinity、-Infinity
- 无法表示的数字
NaN(Not a Number) (例如:0/0 = NaN)
但它是一个数字
64位浮点数
JS数字的存储形式
- 浮点就是浮动的点,意思就是小数点会乱动
64位存储一个number
-
符号占1位
-
指数占11位(-1023~1024)
-
有效数字占52位
范围和精度
范围(忽略符号位)
-
指数拉满、有效数字拉满,得到最大二进制数字
-
Number.MAX_VALUE: 1.7976931348623157e+308
-
指数负方向拉满、有效数字最小1,得到最小值
-
Number.MIN_VALUE: 5e-324
精度(有效数字)
-
最多只能到52+1个二进制位表示有效数字
-
2^53 对应的十进制是 9 后面 15 个零
-
所以15位有效数字都能精确表示
-
16位有效数字如果小于 90 开头,也能精确表示
-
9110000000000001 就存不下来
字符串 string (每个字符两个字节)
写法
-
单引号:'你好'
-
双引号:"你好"
-
反引号: 、、
注意:
-
引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
-
如果要在单引号里面包含单引号怎么办?
转义
错误写法:
-
'it's ok'
-
JS 引擎会认为 'it' 就结束了,后面的看不懂
正确写法:
-
'it's ok' // 这就是转义
-
"it's ok"
-
、it's ok、
用另一种写法表示你想要的东西
-
' 表示 '
-
" 表示 "
-
\n 表示换行
-
\r 表示回车
-
\t 表示 tab 制表符
-
\ 表示 \
-
\uFFFF 表示对应的 Unicode 字符
-
\xFF 表示前 256 个 Unicode 字符
多种字符串
- 如果想要在字符串里回车
let s = 、 用反引号很容易做到
字符串的长度
string.length
-
'123'.length // 3
-
'\n\r\t'.length // 3
-
''.length // 0
-
' '.length // 1
base 64 转码
window.btoa
- 正常字符串为base 64 编码的字符串
window.atob
-
base 64 编码的字符串转为原来的字符串
-
一般用来隐匿招聘启事里的简历
布尔 boolean (真或假)
只有两个值
- true和false,注意大小写
下列运算会得到bool值
- 否定运算
!value
- 相等运算
1 == 2、1 != 2、3 === 4、3 !== 4
- 比较运算
1 > 2、1 >= 2、3 < 4、3 <= 4
if配bool
- if语句常常需要判断真假
f( value ) { ... } else { ... }
-
如果 value 是 bool 值还好说
-
如果 value 不是 bool 值咋办,谁真谁假
-
1 是真还是假,0 是真还是假(真、假)
-
'1' 是真还是假,'0' 是真还是假(真、真)
五个falsy值
fasly就是相当于false,但又不是false的值,分别是:undefined 、null、 NaN、 ''
undefined和null两种空类型
-
区别
-
没有本质区别
细节一
如果一个变量声明了,但没有赋值,那么默认值就是 undefined,而不是 null
细节二
如果一个函数,没有写 return,那么默认 return undefined,而不是 null
细节三
前端程序员习惯上,把非对象的空值写为 undefined,把对象的空值写为 null
符号symbol
- 用的少
变量声明
三种声明方式
-
var a = 1 -
let a = 1 -
const a = 1 -
a = 1
区别
-
var 是过时的、不好用的方式
-
let 是新的,更合理的方式
-
const 是声明时必须赋值,且不能再改的方式
-
最后这种方式是错误的,不准这样声明
let声明
规则
-
遵循块作用域,即使用范围不能超出 { }
-
不能重复申明
-
可以赋值,也可以不赋值
-
必须先声明再使用,否则报错
-
全局声明的 let 变量,不会变成 window 的属性
-
for 循环配合 let 有奇效
const声明
规则
-
跟 let 几乎一样
-
只有一条不一样:声明时就要赋值,赋值后不能改
变量声明
- 指定值
var a = 1
- 同时也指定了类型
var a = 1
- 但是值和类型都可以随意变化
a = 2
a = '字符串'
举例: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()