23. JS数据类型

23. JS数据类型

Unicode 与 UTF8

数字与字符串

都是一,为什么要分1和'1'?

功能不同

数字是数字,字符串是字符串,要严谨

数字能加减乘除,字符串不行

字符串能表示电话号码,数字不行

存储形式不同

JS中,数字是用64位浮点数的形式存储的

JS中,字符串是用类似UTF8形式存储的(UCS-2)

如何存数字

十进制转二进制即可

二进制

10转2

31变成二进制

31=?25+?24+?23+?22+?21+?2031 = ?* 2^5 + ? * 2^4 + ? * 2^3 + ? * 2^2 + ? * 2^1 + ? * 2^0

经过一番尝试

31=025+124+123+122+121+12031 = 0* 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 1 * 2^0

所以31(十进制)= 01111(二进制)

不是套公式吗?程序员从来不套公式😊

2转10

100011变成十进制

每一位乘以2的N次方,然后加起来即可

100011=25+21+20=35100011 = 2^5 + 2^1 + 2^0 = 35

用十六进制表示二进制

为什么用十六进制

因为二进制写起来太慢了

记住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表示所有符号

Screen Shot 2021-12-27 at 11.26.44 AM

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位(两字节)

Screen Shot 2021-12-27 at 8.52.17 PM

后来国标局推出GB18030取代GBK,GB18030不兼容GB2312。

网页里有藏文,泰文怎么办呢?简单,继续编号,这回,一次解决全世界的需求

万国码Unicode

优点

已收录13万字符(大于16位),全世界通用

以后还会继续扩充,不会停止

最新版只添加了一个字,令和的合体字

缺点

两个字节不够用,每个字符要用三个及以上字节,这样所有文件都扩大50%,不划算。那怎么办?虽然用Unicode,但存的时候偷懒,这样行不行,UTF-8就被发明出来了。

UTF-8的8是指最少可以用8位存一个字符。

Screen Shot 2021-12-27 at 8.33.41 PM
Screen Shot 2021-12-27 at 8.34.00 PM

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

Screen Shot 2021-12-28 at 10.13.51 AM

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]

注意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的垃圾之处。

两者没有本质的区别,但是有如下细节上的差异:

  1. 如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是null

  2. 如果一个函数,没有写return,那么默认return undefined,而不是null

  3. 前端程序员习惯上,把非对象的空值写为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 的详细介绍,请看 MDN

目前 bigint 用得很少。面试也基本不考,工作中也较少用到。因为太新了。

最后更新于

这有帮助吗?