23. JS数据类型
23. JS数据类型
Unicode 与 UTF8
数字与字符串
都是一,为什么要分1和'1'?
功能不同
数字是数字,字符串是字符串,要严谨
数字能加减乘除,字符串不行
字符串能表示电话号码,数字不行
存储形式不同
JS中,数字是用64位浮点数的形式存储的
JS中,字符串是用类似UTF8形式存储的(UCS-2)
如何存数字
十进制转二进制即可
二进制
10转2
31变成二进制
经过一番尝试
所以31(十进制)= 01111(二进制)
不是套公式吗?程序员从来不套公式😊
2转10
100011变成十进制
每一位乘以2的N次方,然后加起来即可
用十六进制表示二进制
为什么用十六进制
因为二进制写起来太慢了
记住8 4 2 1对应X X X X
从右往左每四位改写成一位:011110001011010
得到3 12 5 10;把大于9的数字改写成ABCDEF
于是得到3C5A
HEX表示16进制,BIN表示2进制
OCT表示8进制,DEC表示10进制
如何存字符
转成数字不就得了,但是注意,'1' 不能用1来表示
如何存储
用0-127表示所有符号
0表示结束字符
10表示换行
13表示回车
32表示空格
33-47表示标点
48-57表示数字符号
65-90表示大写字母
97-122表示小写字母
127表示删除键
用0000~FFFF表示汉字
一个16进制就是4个0/1位
FFFF就是4x4=16位,也就是两个字节
最多收录2^16=65536个字符
但只收录了6000多汉字,西文字母和日文假名
你的GB2312编号为C4E3
牛的GB2312编号为C5A3
中国人的名字里有生僻字
怎么表示生僻字、繁体字、韩文呢,之前的忘了编进去,怎么办呢?微软出手了,微软推出了一个国际扩展,简称GBK
GBK国标扩
含21886个汉字和图形符号,收录了中日韩使用的几乎所有汉字,完全兼容GB2312
依然使用16位(两字节)
后来国标局推出GB18030取代GBK,GB18030不兼容GB2312。
网页里有藏文,泰文怎么办呢?简单,继续编号,这回,一次解决全世界的需求
万国码Unicode
优点
已收录13万字符(大于16位),全世界通用
以后还会继续扩充,不会停止
最新版只添加了一个字,令和的合体字
缺点
两个字节不够用,每个字符要用三个及以上字节,这样所有文件都扩大50%,不划算。那怎么办?虽然用Unicode,但存的时候偷懒,这样行不行,UTF-8就被发明出来了。
UTF-8的8是指最少可以用8位存一个字符。
JS 数据类型
7种(大小写无所谓)
数字number
字符串string
布尔bool
符号symbol
空undefined
空null
对象object
总结:四基两空一对象
以下不是数据类型
数组,函数,日期
它们都属于object
数字number
64位浮点数
写法
整数写法:1
小数写法:0.1
科学计数法:1.23e4
八进制写法(用得少):0123或001234或0o123
十六进制写法:0x3F或者0X3F
二进制写法:0b11或0B11
特殊值
正0和负0
都等于0,要严谨
无穷大
Infinity,+Infinity,-Infinity
无法表示的数字
NaN(Not a Number)
但它是一个数字(讲一下历史)
64位浮点数
JS数字的存储形式
浮点就是浮动的点,意思就是小数点会乱动
123.456可以表示为1.23456e10^2
也可以表示为12345.6e10^-2
64位存储一个number
符号占1位
指数占11位(-1023~1024)
有效数字占52位(开头的1省略t)
范围和精度
范围(忽略符号位)
指数拉满,有效数字拉满,得到最大二进制数字
Number.MAX_VALUE:1.7976931348623157e+308
指数负方向拉满,有效数字最小1,得到最小值
Number.MIN_VALUE:5e-324
精度(有效数字)
最多只能到52+1个二进制位表示有效数字
2^53对应的十进制是9后面15个零
所以15位有效数字都能精确表示
16位有效数字如果小于90开头,也能精确表示
9110000000000001就存不下来
JS 字符串
每个字符两个字节(JS字符串用的阉割版UTF8)
写法
单引号
双引号
反引号
注意
引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
如果要在单引号里面包含单引号怎么办?
转义
错误写法
JS引擎会认为'it'就结束了,后面的看不懂
正确写法
用另一种写法表示你想要的东西
下面这行要死记硬背记下来
多行字符串
如果你想要在字符串里回车
以前没有反引号的时候,写起来很麻烦,可以看网道教程
字符串的属性
等等,对象才有属性,为什么字符串也有属性?要等学完对象才能解答
字符串的长度
sring.length
通过下标读取字符
string[index]
string[index]
注意index从0开始
s[0]是第一个字符
注意index到length
base64转码
window.btoa
正常字符串转为Base64编码的字符串
window.atob
Base64编码的字符串转为原来的字符串
一般用来隐藏招聘启事里的简历
邮箱:
有时候也用来自欺欺人
所谓的“加密”,也就骗过一部分外行
布尔与 5 个 falsy 值
布尔只有两个值,true和false,注意大小写
下列运算符会得到bool值
否定运算:
!value
相等运算:1 == 2, 1!=2, 3 === 4, 3 !==4
比较运算:1 > 2, 1 >=2 , 3 < 4, 3<=4
if配合bool
if语句常常需要判断真假,比如
那么问题来了,如果value是bool值还好说,如果value不是bool值咋办,谁真谁假,
1是真还是假(真),0是真还是假(假)
'1'是真还是假(真,因为不是空的字符串), '0'是真还是假(真,同理)
于是就有了falsy值。
什么是falsy值?
falsy就是相当于false,但又不是false的值,分别是
undefined
null
0
NaN
''(空的字符串,内部什么都不包含)
⚠️''
和' '
是不一样的,一个是空字符串,一个是空格字符串
undefined 与 null
undefined null
是两种空类型,那么为什么会有两种空类型呢?这就是JS的垃圾之处。
两者没有本质的区别,但是有如下细节上的差异:
如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是null
如果一个函数,没有写return,那么默认return undefined,而不是null
前端程序员习惯上,把非对象的空值写为undefined,把对象的空值写为null,仅仅是习惯上而已
Symbol符号,不怎么常用的数据类型,直接看方方的博客文章
https://zhuanlan.zhihu.com/p/22652486
var、let 与 const
变量声明的三种方式
区别
var是过时的不好用的方式,let是新的更合理的方式,const是声明是必须赋值,且不能再改的方式。最后这种方式是错误的,不准这样声明。
var变量提升
押题时再讲,有兴趣可以提前看网道教程。
Var声明
直接跳过,我们写代码不用var,面试押题前单独讲解
let声明
遵循块作用域,即使用范围不能超出
{}
不能重复声明
可以赋值,也可以不赋值
必须先声明再使用,否则报错
全局声明的let变量,不会变成window的属性,但是如果用var,可以变成window的属性
let把var的毛病都改掉了
for循环配合let有奇效
const声明
跟let几乎一样,但是只有一条不一样:声明时就要赋值,赋值后不能改
变量声明
指定值的同时也指定了类型,但是值和类型都可以随意变化
name和'name'的区别
name
是变量:值可变'name'
是字符串常量:常量就是不变量,'name'只能是'name',不能是其他值
总结
六种类型(大小写无所谓)
undefined
null
number
string
bool
symbol
这些都是简单类型:只有object叫做复杂类型。
类型转换
number => string
string => number
x => bool
x=> string 把任何东西变成字符串
特殊情况
更好玩情况
方方推荐的博客:JS秘密花园。
https://bonsaiden.github.io/JavaScript-Garden/zh/
2020 年 6 月 JS 新增了一种类型:bigint
目前 bigint 用得很少。面试也基本不考,工作中也较少用到。因为太新了。
最后更新于
这有帮助吗?