-曾老湿, 江湖人称曾老大。
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
数字与字符串 |
---|
在代码中,1 和 '1',是不相同的
功能不同,数字是数字,字符串是字符串,严谨
数字能加减乘除,字符串不行
字符串能表示电话号码,数字不行
存储形式不同,在JS中,数字是64位浮点数的形式存储的,字符串是用类似UTF8这种字符编码存储的。
JS如何存储数字 |
---|
在JS中,数字是以二进制的方式来存储的。
十进制转二进制:
31 转成 二进制:31=0x25 + 1x24 + 1x23 + 1x22 + 1x21 + 1x20
所以31转成二进制:01111
二进制转十进制:
100011 转成 十进制:每一位乘以2的N次方,然后加起来
1x25 + 0x24 + 0x23 + 0x22 + 1x21 + 1x20 =35
二进制转十六进制:
因为二进制写起来太慢了:011110001011010 记住8421对应4位。
把上面的二进制拆分为下面的内容,从后往前,每4位是一段,然后再对应8421 011 1100 0101 1010 421 8421 8421 8421
每一段,上下相乘后相加,得到下面4个数字: 3 12 5 10
然后在16进制中,没有10和12 ,0 1 2 3 4 5 6 7 8 9 A B C D E F 最终得出:3C5A


HEX:16进制 BIN:2进制 OCT:8进制 DEC:10进制
JS如何存储字符 |
---|
美国人使用 0~127表示所有符号,总共是2的7次方

0:结束字符 10:换行 13:回车键 32:空格键 33-47:标点符号 48-57:数字符号 65-90:大写字母 97-122:小写字母 127:删除键
中国人开始使用电脑,没有中文字符怎么能行呢?
于是 中国国家标准局,开始编号,命名为[国标2312] gb2312
用 0000~FFFF表示汉字
一个16进制数是4个0/1位
FFFF就是4*4=16位,也就是两个字节
最多收录216=65535个字符
但只收录了6000多汉字、西文字母和日文假名

你:C4E3 牛:C5A3 逼:B1C6
因为没有收录 中国的繁体字,生僻字及韩文,留下了隐患,人名遇到生僻字:
李瓛 =》 李* 陶喆 =》 陶吉吉
于是微软出手了,推出了GBK (国标扩)

含21886个汉子和图形符号,收录了中日韩使用的几乎所有的汉字,并且完全兼容GB2312
依然16位(两个字节)
后来国标局推出GB18030取代GBK,且不兼容GB2312


那么问题又来了,网页里有藏文,泰文,怎么办?
继续编,一次性解决全世界所有的文字,于是出现了:Unicode,万国编码
优点: 已收录13万字(大于16位),全世界通用,以后还会继续扩展不会停止。
最新版2019年,添加了一个字:令和的 合体字(日本的新年号)


缺点:
两个字节不够用,每个字符要用三个及以上字节。这样文件都会扩大50%,不合适
以前硬盘很贵呀...
于是UTF-8就被发明出来了
鸡贼存法:
a
对应Unicode编号为97,十六进制为61
Unicode存法:0000000000000000 01100001
UTF-8存法:01100001
三字节变一字节,比GBK还省
你
对应Unicode编号为4F60
Unicode存法:00000000 01001111011000000
UTF-8存法:11100100 10111101 10100000
还是三字节,没有省,但是字母还能省一点
UTF-8中8的意思就是 最少可用8位存一个字符。
在JS中,主要有以下七种数据类型,大小写无所谓:
数据类型 | 英文 |
---|---|
数字 | number |
字符串 | string |
布尔 | bool |
符号 | symbol |
空 | undefined |
空 | null |
对象 | object |
总结:四基两空一对象
注意:数组,函数,日期,都不是数据类型,它们都属于object
数字number |
---|
64位浮点数
#1.整数
1
#2.小数
0.1
#3.科学计数法
1.23e4
1.23 x 10^4
#4.八进制写法
0123 或 00123 或 0o123
#5.十六进制写法
0x3F 或 0X3F
#6.二进制写法
0b11 或 0B11
特殊值
#1.正0和负0是不一样的
都等于0,要严谨
0
0
+0
0
-0
-0
1/0
Infinity
1/+0
Infinity
1/-0
-Infinity

#2.无穷大
Infinity 默认无穷大
+Infinity 正无穷
-Infinity 负无穷
#3.NaN(Not a Number)
#不能表示的数字
#但是他还是数字
0/0
NaN
NaN === NaN
false

字符串string |
---|
JS存储字符串使用的是阉割版的UTF-8
#1.单引号
'曾老湿'
#2.双引号
"曾老湿"
#3.反引号
`曾老湿`
引号的嵌套:
'it\'s ok'
"it\'s ok"
`it's ok`
'\u4f60'
"你"
'\x31'
"1"
'\x32'
"2"
'\x33'
"3"

如何换行?
let s = `大家好
我是曾老湿
布拉布拉布拉
...`
s
"大家好
我是曾老湿
布拉布拉布拉
..."
let a = '大家好\n我是曾老湿\n布拉布拉布拉\n...'
a
"大家好
我是曾老湿
布拉布拉布拉
..."

字符串的属性
#1.长度
'123'.length
3
'\n\t\r'.length
3
'\\\\\\'.length
3
''.length
0
' '.length
1

#2.字符串下标
var s = 'abcdefg'
s[0]
"a"
s[1]
"b"

#3.base64转码
window.btoa
正常字符串转为base64编码的字符串
window.btoa('123')
"MTIz"
window.atob('MTIz')
"123"
1.MySQL的二进制日志,row模式,查看方法会用到base64
2.一般用来隐藏招聘启事里的简历:MTMzNDExMDIzQHFxLmNvbQ==
3.有时候也能用来自欺欺人,所谓的加密...
布尔bool |
---|
否定运算
!value
相等运算 1 == 2 : false 1 != 2 : true 3 === 4 : false 3 !== 4 : true
比较运算 1>2 : false 1>=2 : false 3<4 : true 3<=4 : false

重点: if 配 bool
if语句常常需要判断真假,if(value){...}else{...}
那么问题来了:
如果value是bool 还好说 如果value不是bool怎么办? 1是真还是假,0是真还是假 '1'是真还是假,'0'是真还是假
JS有五哥falsy值,就是相当于是false但又不是false的值
分别是:undefined null 0 NaN ''
''字符串和' ' 字符串不是一个东西
空 undefined 和 null |
---|
为什么有两个空呢?
这就是JS的原(la)创(ji)之处
区别:
本质上是没有区别的。
1.如果一个变量声明了,但是没有赋值,那么默认就是undefined,而不是 null
2.如果写了一个函数,但是没有写return,那么默认return undefined,而不是 null
3.前端程序猿习惯上,把非对象的空值写为undefined,把对象的空值写为null,仅仅是习惯
symbol |
---|
不常用... 再见
三种声明方式
var a = 1
let a = 1
const a = 1
a = 1
区别
var是过时的,不好用的方式
let是新的,更合理的方式
const是声明是必须复制,且不能再改的方式
a = 1 是错误的声明方式。
let声明
1.遵循块作用域,即 使用范围不能超出{}
{
let a = 1
console.log(a)
}
console.log(a)

2.不能重复声明
let a = 1
let a = 2

除非...
let a = 1
let a = 2
{
let a = 3
}

3.可以赋值,也可以不赋值
let a
let a = 1

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

5.全局声明的let变量,不会变成window的属性
let abc = 'abc'
window.abc

var abc = 'abc'
window.abc

6.for 循环配合 let有奇效
for(var i=0;i<5;i++){
setTimeout(()=>console.log(i),0)
}
5VM1886:2 5
for(let i=0;i<5;i++){
setTimeout(()=>console.log(i),0)
}
VM1913:2 0
VM1913:2 1
VM1913:2 2
VM1913:2 3
VM1913:2 4

const声明
跟let几乎 一样,只有一条,就是声明时必须要赋值,赋值后不能修改。
const i
const i = 100
i
100
const i = 101

for(const i=0;i<5;i++){
setTimeout(()=>console.log(i),0)
}

数字转换成字符串 |
---|
两种方式 1. String(n) 2. n + ''
var n = 1
String(n)
"1"
n + ''
"1"

字符串转换成数字 |
---|
三种方法 1. Number(s) 2. parselnt(s) / parseFloat(s) 3. s-0
var s = '123'
Number(s)
123
s - 0
123
+s
123
parseInt('123')
123
parseInt('123',10)
123

转换成bool |
---|
两种方法 1. Boolean(1) 2. !!1
Boolean(1)
true
Boolean(0)
false
!!1
true
!!0
false

任意类型转换成字符串 |
---|
使用 toString
true.toString()
"true"
false.toString()
"false"
1.toString()
JS的bug使用1.toString
就会报错,因为JS认为,只要输入1.
后面必须接的是数字代表小数。
解决办法:
(1).toString()
"1"
1..toString()
"1"