数字与字符串
都是一,为什么要分 1 和 '1'
功能不同
- 数字是数字,字符串是字符串
- 数字能运算,字符串不行
- 字符串能表示电话号码,数字不行
存储形式不同
- JS中,数字是用64位浮点数形式存储的
- JS中,字符串是用类似UTF8形式存储的(UCS-2)
数字的存储
将所有的十进制转换成二进制
二进制与十进制之间的转换
因为二进制写起来太慢,用十六进制表示二进制
HEX十六进制,BIN二进制,OCT八进制,DEC十进制
字符的存储
用0~127表示键盘所有符号
特殊的有:0 用48表示;A 用65表示;a用97表示
中文字符编号【国标2312】
0000~FFFF表示汉字
微软进行了国标扩【GBK】
还有好多文字不能显示,推出Unicode
- 优点
收录了13万的字符(大于16位),全世界通用
以后还会继续扩充,不会停止
最新版本添加一个字 令和 - 缺点
两个字节不够用,每个字符要用三个及以上字节
所有文件都扩大50%,不划算
关于缺点的解决方法UTF-8
JS中的数据类型
七种(大小写无所谓)
数字number
字符串string
布尔bool
符号symbol
空undefined
空null
对象object
总结:四基两空一对象
以下不是数据类型
数组、函数、日期
它们都属于object
数字number
写法
- 整数写法
1 - 小数写法
0.1 - 科学计数法
1.23e4 - 八进制写法(较少)
0123,00123,0o123 - 十六进制写法
0x3F,0x3F - 二进制写法
0b11,0B11
特殊值
- 正0不同于负0
数除以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省略)
范围和精度
- 范围(忽略符号位)
指数拉满,有效数字拉满,得到最大二进制数字
Number.MAX_VALUE: 1.7976931348623157e+308
指数负方向拉满,有效数字最小1,得到最小值
Number.MIN_VALUE: 5e-324 - 精度(有效数字)
最多只能到52+1个二进制表示有效数字
2^53对应的十进制是9后面15个零
所以15位有效数字都能精确表示
16位有效数字如果小于90开头,也能精确表示
9110000000000001就存不下来
字符串string
每个字符两个字节
写法
- 单引号
'你好' - 双引号
"你好" - 反引号
`你好` - 注意:引号部署一字符串的一部分,就像书名号不属于书名的一部分一样
转义
- 错误写法
'it's ok'
JS引擎会认为'it'就结束了 - 正确写法
'it's ok' \这就是转义
"it's ok"
`it's ok` - 用另一种写法表示想要的东西
\' 表示'
\"表示"
\n表示换行
\r表示回车
\t表示tab制表符
\表示
\uFFFF表示对应的Unicode字符
\xFF表示前256个Unicode字符
多行字符串
- 如果你想在字符串里回车
let s = `这样是
可以的
用反引号很容易做到`
字符串的属性(对象才应该有属性,后面讲)
- 字符串的长度
string.length
'123'.length //3
'\n\r\m'.length //3 - 通过下标读取字符
string[index]
let s = 'hello';
s[0] //"h"
注意index从0开始
s[0]是第一个字符
注意index到length
let s = 'hello';
s[5] //undefined不会报错
s[4] //'o'
布尔bool
true 和 false,注意大小写
下列运算会得到布尔值
- 否定运算
!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值如何
1是真还是假,0是真是假
'1'是真是假,'0'是真是假
五个falsy值
falsy就是相当于false但又不是false的值
分别是:underfined null 0 NaN ''(''和' '不是一个东西)
除了这几个加上false其余都是真的
undefined和null两种类型
为什么有两种空(垃圾)
- 没有本质区别
- 如果一个变量声明了,但是没有赋值,那默认值就是undefined而不是null
- 如果一个函数,没有写return,那么默认return undefined,而不是null
- 习惯上把非对象的空值写为undefined,把对象的空值写为null