一、JS的数据类型--四基两空一对象
- 数值(number):整数和小数(比如1和3.14)
- 字符串(string):文本(比如Hello World)。
- 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
- 符号(symbol)
- undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- null:表示空值,即此处的值为空。
- 对象(object):各种值组成的集合。
注:数组、函数、日期属于特殊的对象
二、数值(number)
(一)数值的储存方式:浮点数
1. JavaScript 内部,所有数字都会变成二进制之后以64位浮点数形式储存
2. 具体步骤
3. 规则模板
- 正负号:占一位,正数用0,负数用1
- 指数部分:占11位(2^11=1024到-1023)
- 有效数字:去掉开头的1.(因为大家都有),去掉最后面的0,总共占52位。
4. 浮点数的范围
(1)最大值
- 把指数部分11位和有效数字的52位全设为1,可得最大的二进制数字
- 换成十进制为
Number.MAX_VALUE: 1.7976931348623157e+308
(2)最小值
- 指数负方向拉满、有效数字最小1,得到最小的二进制数字
- 换成十进制为
Number.MIN_VALUE: 5e-324
5. 精度
- 最多只能到52+1个二进制位表示有效数字
- 2^53对应的十进制是9后面15个零
- 所以对于十进制来说15位数字都能精确表示
- 16位有效数字如果小于90开头,也能精确表示
- 91 10000000000001就存不下来
6.我的疑惑
这里都是按照最高位来算,比如2的53次方,假设2的52次方后面都为0了???? 加上之后数字更大啦,为啥不加上2的52次方以及更小的???? 还有2^11=1024,为啥不加上2^10????
(二)数值的表示法
- 整数
- 小数
- 科学计数法
- 小数点前的数字多于21位,JS会自动将数值转为科学计数法表示
- 小数点后的零多于5个,JS会自动将数值转为科学计数法表示
(三)数值的进制
JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。
- 十进制:没有前导0的数值。
- 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。如0123或00123或0o123
- 十六进制:有前缀0x或0X的数值。如0x3F或0X3F
- 二进制:有前缀0b或0B的数值。如0b11或0B11
(四)特殊数值
1、正零和负零
-
几乎所有场合,正零和负零都会被当作正常的0。
-
唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的。
2、NaN
(1)含义
NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number)
(2)运算规则
-
NaN不等于任何值,包括它本身。
-
数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。
-
NaN在布尔运算时被当作false。
-
NaN与任何数(包括它自己)的运算,得到的都是NaN。
3.Infinity
(1)含义 :Infinity表示“无穷”,用来表示两种场景。
- 一种是一个正的数值太大,或一个负的数值太小,无法表示
- 另一种是非0数值除以0,得到Infinity。
(2)Infinity有正负之分,Infinity表示正的无穷,-Infinity表示负的无穷。
(3)Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)。
(4)Infinity与NaN比较,总是返回false。
(5)运算规则:
- Infinity的四则运算,符合无穷的数学计算规则。
5 * Infinity // Infinity
5 - Infinity // -Infinity
Infinity / 5 // Infinity
5 / Infinity // 0
- 0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity。
0 * Infinity // NaN
0 / Infinity // 0
Infinity / 0 // Infinity
- Infinity加上或乘以Infinity,返回的还是Infinity。
Infinity + Infinity // Infinity
Infinity * Infinity // Infinity
- Infinity减去或除以Infinity,得到NaN。
Infinity - Infinity // NaN
Infinity / Infinity // NaN
- Infinity与null计算时,null会转成0,等同于与0的计算。
null * Infinity // NaN
null / Infinity // 0
Infinity / null // Infinity
- Infinity与undefined计算,返回的都是NaN。
undefined + Infinity // NaN
undefined - Infinity // NaN
undefined * Infinity // NaN
undefined / Infinity // NaN
Infinity / undefined // NaN
三、字符串string
1、每个字符两个字节
2、写法
- 单引号:如
'你好' - 双引号:如
"你好" - 反引号:如
你好,在反引号中可以直接回车,不用转义
●注意:引号不属于字符串的一部分,就像书名号不属于书名的部分一样
3、转义
-
\'表示' -
\"表示" -
\n表示换行 -
\r表示回车 -
\t表示tab制表符 -
\ \表示\ -
\uFFFF表示对应的Unicode字符 -
\xFF表示前256个Unicode字符
4、字符串的属性
(1)字符串不该有属性!只有对象才有属性。至于为什么,学完对象再来
(2)字符串的长度string.length
'123' . length // 3
'\n\r\t' .length // 3
''.length // 0 空字符串
' '.length // 1 里面有个空格,不是空字符串
(3)通过下标读取字符string[index]
let S = 'hello';
s[0] // "h"
注意index从0开始,s[0]是第一个字符,最后一个字符应该是length-1
let s = 'hello';
s[5] // undefined,居然不报错
s[4]// 'o'
5、base64转码
window.btoa正常字符串转为Base64编码的字符串window.atobBase64编码的字符串转为原来的字符串- 一般用来隐藏招聘启事里的简历,比如邮箱:MjYzODE0MzcxNUBxcS5jb20=
- 不可用来「加密」,也就能骗过一部分外行,内行一转码就出来了!
四、布尔值boolean
-
布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示。布尔值只有这两个值。
-
下列运算符会返回布尔值:
- 前置逻辑运算符:
! (Not) - 相等运算符:
===,!==,==,!= - 比较运算符:
>,>=,<,<=
- 如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
undefinednullfalse0NaN""或''(空字符串)
五、null与undefined
- null与undefined都可以表示“没有”,没有本质区别
- 细节一:如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是 null
- 细节二:如果一个函数,没有写return,那么默认return undefined,而不是null
- 细节三:前端程序员习惯上,把非对象的空值写为undefined,把对象的空值写为null,但仅仅是习惯上而已
六、symbol符号
用的极少,可看方应杭的博客
七、类型转换
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()