JS数据类型
数字与字符串
-
都是1,为什么要分1和‘1’
-
功能不同
- 数字是数字,字符串是字符串,要严谨
- 数字能加减乘除,字符串不行
- 字符串能表达电话号码,数字不行
-
存储形式不同
- JS中,数字是用64位浮点数的形式存储的
- JS中,字符串是用类似UTF8形式存储的(UCS-2)
如何存数字
将十进制转为二进制直接进行存储
如何存储字符
转成数字不就得了,但是注意,‘1’不能用1来表示
而是通过编码转为二进制再进行存储
UTF-8中的8的意思是 最少可用8位存一个字符
JS中的数据类型
-
7种(大小写无所谓)
- 数字 number
- 字符串 string
- 布尔 bool
- 符号 symbol
- 空 undefined
- 空 null
- 对象 object
- 总结:四基两空一对象
-
以下不是数据类型
- 数组、函数、日期
- 它们都属于object 是一种特殊的对象
数字 number
64位浮点数
写法
-
整数写法 1
-
小数写法 0.1
-
科学计数法 1.23e4
-
八进制写法 0123
-
十六进制写法 0x3F
-
二进制写法 0b11
-
正0和负0 都等于0,但是在1/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
每个字符两个字节(阉割版UTF8)
写法
- 单引号
'你好'
- 双引号
"你好"
- 反引号
`你好`
-
注意
- 引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
- 如果要在单引号里面包括单引号怎么办呢
转义
- 错误写法
'it'sok'
//js引擎会认为'it'就结束了,后面的看不懂
- 正确写法
'it's ok' //这就是转义
"it'sok"
`it'sok`
- 用另一种写法表示你想要的东西就是转义
' 表示 '
" 表示 "
\n 表示换行
\r 表示回车
\t 表示制表符
\ 表示 \
\uFFFF表示对应的Unicode字符
\xFF表示钱256个Unicode字符
多行字符串
- 如果你想要在字符串里回车 `` 反引号是能做到的
string .length可以读取字符串长度
string【index】可以通过下标读取字符串
base64转码
-
windows.btoa
- 正常字符串转为Base64编码的字符串
-
window.atob
- 正常字符串转为Base64编码的字符串
-
一般用来隐藏招聘启事里的简历邮箱
- MTMzMjg3NTA5ODJAMTYzLmNvbQ==
-
有时候也用来自欺欺人
- 所谓的加密也就能骗过一部分外行
布尔 boolean
真或假
下列运算符会得到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 ''
undefined 和 null 两种空类型
这是JS的原创之处
-
没有本质区别
-
细节一
- 如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是null
-
细节二
- 如果一个函数,没有写return,那么默认返回return undefined,而不是null
-
细节三
- 前端程序员习惯上,把非对象的空值写为undefined,把对象的空值写为null
- 但仅仅是习惯上而已
symbol
每个从 Symbol() 返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。
详细的可以参考文章:developer.mozilla.org/zh-CN/docs/…
变量声明
-
三种变量声明
- var a =1
- let a=1
- const a=1
-
区别
- var 是过时的、不好用的方式
- let是新的,更合理的方式
- const是声明时必须布置,且不能再更改的方式
-
var 变量提升
let声明
-
规则
- 遵循块作用域,即使用范围不超出{}
- 不能重复申明
- 可以赋值,也可以不赋值
- 必须先声明再使用,否则报错
- 全局声明的let变量,不会变成window的属性
- for循环配合let有奇效
const 声明
-
规则
- 跟let几乎一样
- 只有一条不一样:声明时就要赋值,赋值后不能更改
变量声明在指定值的同时也指定了类型,但是值和类型都可以随意变化
name和'name'的区别
-
name是变量
- 值可变,可能是'name',也可能是'hello'
-
'name'是字符串常量
- 常量就是不变量
- 'name'只能是'name',不能是其他值
类型转换
-
number=>string
- String(n)
- n+''
-
string=>number
- Number(s)
- parseInt(s)/parseFloat(s)
- s-0
-
x=>bool
- Boolean(x)
- !!x
-
x=>string
- String(x)
- x.toStirng()