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

2022-09-26 16:37:36 浏览数 (1)

  • 数据类型的存储
  • 数据类型
  • 变量声明
  • 数据类型转换

-曾老湿, 江湖人称曾老大。


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

代码语言:javascript复制
#1.整数
1

#2.小数 
0.1

#3.科学计数法
1.23e4
1.23 x 10^4

#4.八进制写法
0123 或 00123 或 0o123

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

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

特殊值

代码语言:javascript复制
#1.正0和负0是不一样的
都等于0,要严谨

0
0

 0
0

-0
-0

1/0
Infinity

1/ 0
Infinity

1/-0
-Infinity

代码语言:javascript复制
#2.无穷大


Infinity  默认无穷大

 Infinity 正无穷

-Infinity 负无穷
代码语言:javascript复制
#3.NaN(Not a Number)

#不能表示的数字
#但是他还是数字

0/0
NaN


NaN === NaN
false


字符串string

JS存储字符串使用的是阉割版的UTF-8

代码语言:javascript复制
#1.单引号
'曾老湿'

#2.双引号
"曾老湿"

#3.反引号
`曾老湿`

引号的嵌套:

代码语言:javascript复制
'it's ok'

"it's ok"

`it's ok`
代码语言:javascript复制
'u4f60'
"你"

'x31'
"1"

'x32'
"2"

'x33'
"3"

如何换行?

代码语言:javascript复制
let s = `大家好
我是曾老湿
布拉布拉布拉
...`

s
"大家好
我是曾老湿
布拉布拉布拉
..."

let a = '大家好n我是曾老湿n布拉布拉布拉n...'

a
"大家好
我是曾老湿
布拉布拉布拉
..."

字符串的属性

代码语言:javascript复制
#1.长度
'123'.length
3
'ntr'.length
3
'\\\'.length
3
''.length
0
' '.length
1

代码语言:javascript复制
#2.字符串下标
var s = 'abcdefg'
s[0]
"a"
s[1]
"b"

代码语言:javascript复制
#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

不常用... 再见

变量声明

三种声明方式

代码语言:javascript复制
var a = 1
let a = 1
const a = 1

a  = 1

区别

var是过时的,不好用的方式

let是新的,更合理的方式

const是声明是必须复制,且不能再改的方式

a = 1 是错误的声明方式。

let声明

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

代码语言:javascript复制
{
    let a = 1
    console.log(a)
}
console.log(a)

2.不能重复声明

代码语言:javascript复制
let a = 1

let a = 2

除非...

代码语言:javascript复制
let a = 1

let a = 2

{
    let a = 3
}

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

代码语言:javascript复制
let a

let a = 1

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

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

代码语言:javascript复制
let abc = 'abc'

window.abc

代码语言:javascript复制
var abc = 'abc'

window.abc

6.for 循环配合 let有奇效

代码语言:javascript复制
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几乎 一样,只有一条,就是声明时必须要赋值,赋值后不能修改。

代码语言:javascript复制
const i

const i = 100

i
100

const i = 101

代码语言:javascript复制
for(const i=0;i<5;i  ){
    setTimeout(()=>console.log(i),0)
}

数据类型转换


数字转换成字符串

两种方式 1. String(n) 2. n ''


代码语言:javascript复制
var n = 1

String(n)
"1"

n   ''
"1"


字符串转换成数字

三种方法 1. Number(s) 2. parselnt(s) / parseFloat(s) 3. s-0


代码语言:javascript复制
var s = '123'

Number(s)
123

s - 0
123

 s
123

parseInt('123')
123

parseInt('123',10)
123


转换成bool

两种方法 1. Boolean(1) 2. !!1


代码语言:javascript复制
Boolean(1)
true

Boolean(0)
false

!!1
true

!!0
false


任意类型转换成字符串

使用 toString

代码语言:javascript复制
true.toString()
"true"

false.toString()
"false"

1.toString()

JS的bug使用1.toString就会报错,因为JS认为,只要输入1.后面必须接的是数字代表小数。

解决办法:

代码语言:javascript复制
(1).toString()
"1"

1..toString()
"1"

0 人点赞