JS 数据类型
JS 数据类型有:数字(number)、字符串(string)、布尔(bool)、符号(symbol)、空(undefined)、空(null)、对象(object)、bigint。
总结:“四基两空一对象”,还有一个是bigint是新增的。
注:数组、函数、日期属于特殊的对象
一、数值(number)
数值的存储方式
JS中,数字是用64位浮点数的形式存储的。(二进制)
其中符号占1位,指数部分有11位,范围从-1023到+1024,有效数字有 52 位,需要省略开头的 1 。 例如:0.5的存储方式是 0|-1|0 。
浮点数的范围
(1)最大值
- 把指数部分11位和有效数字的52位全设为1(拉满),可得最大的二进制数字
- 换成十进制为 Number.MAX_VALUE: 1.7976931348623157e+308
(2)最小值
- 指数负方向拉满、有效数字最小1,得到最小的二进制数字
- 换成十进制为Number.MIN_VALUE: 5e-324
精度
- 最多只能到52+1个二进制位表示有效数字
- 2^53对应的十进制是9后面15个零
- 所以对于十进制来说15位数字都能精确表示
- 16位有效数字如果小于90开头,也能精确表示
- 91 10000000000001就存不下来
数值的表示法:
- 整数 1
- 小数 0.1
- 科学计数法 1.23e4 (e4就是乘以10的4次方)
- 八进制(用得少)0123,00123,0o123
- 十六进制 0x3F 0X3F (用得少)
- 二进制 0b11 或0B11 (用得少)
数值的进制
JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制
- 十进制:没有前导0的数值
- 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。如0123或00123或0o123
- 十六进制:有前缀0x或0X的数值。如0x3F或0X3F
- 二进制:有前缀0b或0B的数值。如0b11或0B11
特殊数值
- 正0 和 负0都等于 0, 但是是三个数
- 无穷大: Infinity 、+Infinity 、-Infinity
- 无法表示的数字:NaN(Not a Number),但他是一个数字 。(比如0除以0,返回NaN) NaN不等于任何值,包括NaN。
二、字符string
1、写法
- 单引号 'hi'
- 双引号 "hi"
- 反引号 ``
引号不属于字符串的一部分
2、转义
例如 'it's ok' ,JS引擎会认为 'it' 就结束了。
正确写法
- 转义: 前面加斜杠 \ ,例如 'it's ok'
- 外面用双引号:"it's ok"
- 外面用反引号
转义——用另一种写法表示你想要的东西
- ' —— ' 单引号
- " —— " 双引号
- \n —— 换行
- \r —— 回车
- \t —— tab 制表符
- \ —— \斜杠
- \uFFFF —— 对应的Unicode 字符
- \xFF —— 前 256 个Unicode 字符
- 多行字符串:外面用反引号
3、字符串长度
string.length —— 即可看见字符串string的长度 例如:'\n\r\t'.length //值为3
通过下标可以读取字符(类似数组) 例如:let s='hello';s[0] //值为"h"
4、base64转码
- window.btoa(字符串)—— 正常字符串转为Base64编码的字符串
- window.atob(字符串) —— Base64编码的字符串转为原来的字符串
字符串的属性
注意:
字符串不该有属性!只有对象才有属性(原因之后再说)
三、布尔(bool)
只有两个值,true和false
下列运算符会返回布尔值:
- 前置逻辑运算符:
! (Not)
- 相等运算符:
===
,!==
,==
,!=
- 比较运算符:
>
,>=
,<
,<=
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true
undefined
null
false
0
NaN
- ''(空字符串)
这五个 falsy 值代表假的。(还有false)
四、undefined和null
undefined 和 null 是两种空类型,区别如下:
- 声明变量但是没有赋值,默认值是undefined,不是null。
- 函数没有return,那么默认return undefined,而不是 null。
- 习惯上,非对象的空值写为undefined,把对象的空值写为 null。
五、symbol符号
六、变量声明
三种声明方式
var a = 1
是过时的、不好用的方式let a = 1
是新的,更合理的方式const a = 1
是声明时必须赋值,且不能再改的方式a = 1
最后这种方式是错误的,不准这样声明
let声明
- 遵循块作用域,适用范围不能超过{}
- 不能重复声明
- 可以赋值,也可以不赋值
- 必须先声明再使用
- 全局声明的let变量,不会变成window属性
- for循环配合let 有奇效
const声明
- 跟let规则一样
- 只有一条不同,声明时就要赋值,赋值后不能改
注意:声明变量的同时,也指定了类型,但是值和类型都可以随时变化
七、 类型转换
1、number => string
String(n)
n+''
''+n
2、string => number
Number(s)
parseInt(s)
parseFloat(s)
s-0
+s
3、x => bool
Boolean(x)
!!x
一个感叹号可把任何东西取反布尔值,再来一个就是反布尔值的反布尔值,也就是原始布尔值
4、X => string
String(x)
x.toString()
- 数字1不可用上面的,因为默认1.后面应是小数。bug!
(1).toString()
1..toString()
1 .toString()
&&短路逻辑
和以往我的想法不一样,&&的值并不是true或者false, 它取第一个假值或者最后一个表达式的值
- 1 && 2 的值是2
- 1&& 2 && 3 && 0 && 4 的值是0
||短路逻辑
同理,||取第一个真值 或者最后一个表达式的值
- 1||0||2||3 的值是1
- 0|| 0 || 5的值是5
-
网络异常,图片无法展示|
参考资料
内容参考 JavaScript 教程
有时间必看 JS秘密花园
关于 bigint 的详细介绍developer.mozilla.org/zh-CN/docs/…