数字与字符串
1
和'1'
完全不同
功能
- 数字能加减乘除模和值的比较,字符串不能计算值,无法进行值的大小比较(严谨的说不算隐式转换的话)
- 字符串能表示电话号码,数字不行,数字不能表示开头是
0
,硬上会造成数据损失 - 不同国家的电话号码中甚至可以有字母
存储形式
- JS中,数字是用64位浮点数的形式存储的
- JS中,字符串是用类似
UTF-8
的形式存储的(UCS-2
ASCII码)
如何存数字
把十进制转二进制即可
二进制
10转2
有公式,但程序员不是数学家,从来不套公式,只尝试,按数位展开,按位累加
2转10
用十六进制表示二进制
TL,DR
计算器程序员模式
HEX
16 BIN
2 OCT
8 DEC
10
如何存字符
转成数字,但
'1'
不能用1
来表示
UTF8
存储abc123
编号
0~127
(2^7)表示所有符号
0
表示结束字符NUL
(null)10
表示换行13
表示回车27
表示’ESC'32
表示空格33
~47
表示标点48
~57
表示数字符号65
~90
表示大写字母97
~122
表示小写字母127
表示删除键
0
用48
表示,A
用65
表示,a
用97
表示,其他用到再查其他编码基本兼容以上,即前128位都为以上表示
键盘监听事件
中文字符的编码
「国标2312」
0000
~FFFF
表示汉字一个16进制数是4个
0/1
位
FFFF
就是4*4=16
位,即两个字节最多收录
2^16 = 65536
个字符但只收录了6k多汉字、西文字母和日文假名
生僻字、繁体字、其他东亚字符无法表示
- 国标局官方的效率差,微软出了
GBK
,国标扩
含
21886
个汉字和图形符号收录中日韩使用的几乎所有汉字
依然使用16位(两字节)
后国标局推出
GB18030
想取代GBK
,但竟然不兼容GB2312
- 怎么表示其他语言文字,藏文,泰文…
万国码
Unicode
Unicode
优点
- 已收录0.13M多个字符(大于16位),世界通用
- 以后会扩充
- 最新版(2019)添加了一个字——令和的合体字
缺点
- 两个字节不够用,每个字符要用三个及以上的字节
- 所有文件都扩大50%,不划算
用(读写)
Unicode
,存的时候简化
UTF-8
UTF-8
鸡贼的算法
存储「a」
a
对应的Unicode
编号为97
,十六进制为61
Unicode
直接存:00000000
00000000
011000011
UTF-8
偷懒存:011000011
- 三字节变一字节,比GBK还省
存储「你」
- 「你」对应
Unicode
编号4F60
Unicode
直接存:00000000
01001111
01100000
UTF-8
偷懒失败存:11100100
10111101
10100000
- 还是三字节,没省,但是字母都能省一点
UTF-8
中的8
的意思是
最少可用8位存一个字符,其他可以是16位,24位数位
UTF-8
的规则
由开头的数字表示用几个8位表示
详见PDF第25页 数据类型和运算符.pdf
位运算
TL,DR
比喻:去餐厅排队
如何存字符,就是编码,然后存编码
1
和'1'
功能不同,存储形式不同
1
是变成二进制直接存
'1'
要经过编码(变成49
)再存那计算机怎么知道存的是数字还是字符?
计算机不用知道,用文件格式表示
文本格式
.txt
全用字符串表示,可以在另存为中,选择保存的编码即计算机通过文件格式来约定存储的是什么
.html
文件只支持字符串
拉回正题
JS中的数据类型
目前八种(截止2020,以后还会增加?)
7种原始类型(大小写无所谓只有写代码时要区分大小写)
-
数字
number
-
字符串
string
-
布尔
boolean
-
空
undefined
-
空
null
增加的
- 符号
symbol
抄ruby
- 大型整数
bigint
1种复杂类型
- 对象
object
以下不是数据类型
- 数组、函数、日期
以上都属于
object
数字number
64位浮点数
写法
一般写法
- 整数写法:
1
- 小数写法:
0.1
或.123
不常用
- 科学记数法:
1.2e4
- 八进制:
0123
或00123
或0o123
- 十六进制:
0x3F
或0X3F
- 二进制:
0b11
或0B11
特殊值
正零和负零
- 都等于
0
区别
|
|
无穷大
Infinity
、+Infinity
、-Infinity
无法表示的数字
- NaN(not a number)
- 不能表示的数字,但TM还是一个数字
- 但它不等于自己
|
|
64位浮点数
JS数字的存储形式
- 浮点就是 ‘浮动的点’,意思是小数点会乱动
123.456
可以表示为1.23456e10^2
- 也可表示为
12345.6e10^-2
64位存储一个number
- 符号占1位
- 指数占11位(-1023~1024)
- 有效数字占52位(开头的1省略)
JS浮点数 | 11位 | 53位 |
---|---|---|
0正 | 指数部分(有正负) | 有效数字(省去第一个1 ) |
1负 | 指数部分(有正负) | 有效数字(省去第一个1 ) |
++±++ 1.++01100110++ x 2^++8++(二进制)
范围和精度
范围(忽略符号位)
- 指数拉满、有效数字拉满,得到最大二进制数字
Number.MAX_VALUE
:1.7976931348623157e+308
- 指数负方向拉满、有效数字最小
1
,得到最小值 NUmber.MIN_VALUE
:5e-324
精度
- 最多只能到
52+1
个二进制位表示有效数字 2^53
对应的十进制是9
之后15
个零- 所以
15
位有效数字以内都能精确表示 16
位有效数字如果小于90
开头,也能精确表示911·000·000·000·000·1
(忽略·
),就存不下来
字符串string
每个字符两个字节(阉割版UTF8)
字符串string
写法(ES6)
- 单引号
‘Hi’
- 双引号
“Hello”
- 反引号
`Aloha`
注意
- 引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
- 如果要在单引号里包含单引号咋办?
用转义符
\
转义
用另一种写法表示你想要的东西
错误写法
'it' ok'
- JS引擎会以为
'it'
就结束了,后面的看不懂 - 在
Chrome
控制台测试,不要看控制台的返回值的双引号,会扰乱视听
正确写法
- 在
Chrome
控制台敲入以下代码试试 -
'it\'s ok'
这就是转义 -
"it's ok"
交替使用 - `it’s ok` 反斜杠通吃
转义其他表示法
\'
表示'
\"
表示"
\n
表示换行\r
表示回车\t
表示制表符\\
表示\
\uFFFF
表示对应的Unicode
字符\xFF
表示前256
个Unicode
字符
|
|
多行字符串string
在字符串例敲回车
|
|
以前没有反引号的时候写起来很麻烦
字符串的属性
只有对象才有属性,隐式转换成了包装对象,才有了属性
字符串的长度
string.length
的变态情况
'123'.length //3
'\n\r\t'.length //3
'\\\\\\'.length //3
两个反斜杠表示一个反斜杠''.length //0
空字符串' '.length //1
空格字符串- 可以试试6个空格的长度,就是6
通过下标读取字符
string[index]
|
|
注意
index
从0
开始
s[0]
是第一个字符
注意
index
到length
|
|
base64
转码
window.btoa(‘xxx’)
- 正常字符串为
Base64
编码的字符串
window.atob(‘xxx’)
Base64
编码的字符串转为原来的字符串
一般用来隐藏招聘启事里的简历
- 邮箱:
ZmFuZ3lpbmdoYW5nQGZveG1haWwuY29t
「加密」不可靠,有其他专门的方法
布尔boolean
真或假
只有两个值,注意大小写:
true
和false
会得到bool
值的运算符
否定运算
!value
表示取反
相等运算(等性运算)
1 == 2
1 != 2
3 === 4
3 !== 4
比较运算
1 > 2
1 >= 2
3 < 4
3 <= 4
if
配bool
if
语句常常需要判断真假
if(value){...}else{...}
问题来了
如果
value
是bool
值还好说如果
value
不是bool
值,比如一个表达式,咋办,孰真孰假?
1
是真是假,0
是真是假
'1'
是真是假,'0'
是真是假
五个falsy
值
falsy
就是相当于false
但又不是false
的值分别是
undefined
、null
、0
、NaN
、``(空字符串,没空格)加上
false
,一共六个假值其他所有一切,都是真值,包括函数,空数组,空对象
''
和' '
(一个空格)不同,保持严谨- 把输入法的设置标点都改为在IDE应用中都使用英语标点
空类型undefined
和null
JS原(la)创(ji)
undefined
是补null
bug补来的
区别
没有本质区别
-
细节一:如果一个变量声明了,但没有赋值,那么默认就是
undefined
,而不出null
-
细节二:如果一个函数,没有写
return
,那么默认return undefined
,而不是null
-
细节三:仅前端习惯上,把非对象的控制写成
undefined
,把对象的空值写为null
,没有任何语法依据
undefined
是默认空,null
是主动清空
符号symbol
不常用的数据类型
大型整数bigInt
javascript 中基于BigInt 实现定点数 BigFixed
2020年从基础到进阶,测试你有多了解 JavaScript,刷新你的知识
从 JavaScript、ES6、ES7 到 ES10,你学到哪儿了
也许也用不到
对象object
复杂类型,另开一篇笔记
变量声明
三种声明方式
|
|
区别
var
是过时的、不好用的方式,直接跳过,写业务代码不用var
,演示时在控制台调试用var
,可重复声明变量,面试另说let
是新的、更合理的方式的变量声明const
是声明时必须赋值,且不能再改的方式,即常量声明a = 1
错误的声明方式,起效,不规范 只是赋值 并不是声明全局变量- 在函数外声明,挂在
window
上,只是window
的属性,不规范,不用
|
|
var
变量提升
面试必有,看 网道 变量提升
工作不准用
var
let
声明规则
- 遵循块作用域,即使用范围不能超出
代码块{}
- 不能重复声明,重复声明会报错,除非在其他代码块内
- 可以赋值,也可不赋值
- 必须先声明,再使用,否则报错,即不会变量提升
- 全局声明的
let
变量,不会变成window
的属性(var
会) - 配合
for
循环使用,有奇效
|
|
配合
for
循环使用,有奇效
|
|
const
声明规则
- 和
let
几乎一样 - 只是:声明时就要赋值,赋值后不能改,即有且仅有一次赋值
- 只读变量,即常量
变量声明的过程中,发生了什么
|
|
变量声明的细节
- 指定了值
var = 1
- 同时也就指定了类型
var = 1
但是值和类型都可以随意变化
|
|
name
和'name'
的区别
name
是变量
- 值可变,可能是字符串
'name'
,也可能识别的 - 存在内存的未知区
'name'
是字符串常量
- 常量就是不变量
name
只能是name
,不是其他值- 存在内存的
Stack
栈区
类型转换
number
=>string
String(n)
n + ''
string
=>number
Number(s)
parseInt(s)/parseFloat(s)
s - 0
+s
parseInt(0123)
返回123
,不需要加参数,也默认十进制,parseInt(0123,10)
,是ES6之前(0
开头数字以8进制转换)的bug另一个bug:
String(1000000000000000000000)
返回1e21
x
=>bool
Boolean(x)
!!x
取原始布尔值
x
=>string
String(x)
x.toString()
bug:
1.toString()
报错改为
(1).toString()
或改为
1..toString()
1.
解析为1.0
,即1.0.toString()
,竟然合法
参考文章
记录JS各种奇葩bug的JavaScript 秘密花园
javascript 中基于BigInt 实现定点数 BigFixed
2020年从基础到进阶,测试你有多了解 JavaScript,刷新你的知识
从 JavaScript、ES6、ES7 到 ES10,你学到哪儿了
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简