前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >19·灵魂前端工程师养成-JavaScript数据类型和运算符

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

作者头像
DriverZeng
发布2022-09-26 16:37:36
9700
发布2022-09-26 16:37:36
举报
文章被收录于专栏:Linux云计算及前后端开发

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


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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据类型的存储
  • 数据类型
  • 变量声明
  • 数据类型转换
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档