19·灵魂前端工程师养成-JavaScript数据类型和运算符

2019-05-07 分类:JavaScript, 前端开发 阅读(42) 评论(0)

-曾老湿, 江湖人称曾老大。
-笔者QQ:133411023、253097001
-笔者交流群:198571640
-笔者微信:z133411023


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。
-擅长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"

关于 曾老湿
我只是一个躲在角落里瑟瑟发抖的小运维,随时准备给大佬端茶递水。
WeChat:z133411023
QQ:133411023
欢迎新朋友你的到来!
还没有人抢沙发呢~
昵称
邮箱
网站
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册