【JS】JS数据类型

316 阅读6分钟

一、JS的数据类型--四基两空一对象

  1. 数值(number):整数和小数(比如1和3.14)
  2. 字符串(string):文本(比如Hello World)。
  3. 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
  4. 符号(symbol)
  5. undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  6. null:表示空值,即此处的值为空。
  7. 对象(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????

(二)数值的表示法

  1. 整数
  2. 小数
  3. 科学计数法
  • 小数点前的数字多于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.atob Base64编码的字符串转为原来的字符串
  • 一般用来隐藏招聘启事里的简历,比如邮箱:MjYzODE0MzcxNUBxcS5jb20=
  • 不可用来「加密」,也就能骗过一部分外行,内行一转码就出来了!

四、布尔值boolean

  1. 布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示。布尔值只有这两个值。

  2. 下列运算符会返回布尔值:

  • 前置逻辑运算符: ! (Not)
  • 相等运算符:===!====!=
  • 比较运算符:>>=<<=
  1. 如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
  • undefined
  • null
  • false
  • 0
  • NaN
  • ""''(空字符串)

五、null与undefined

  1. null与undefined都可以表示“没有”,没有本质区别
  2. 细节一:如果一个变量声明了,但没有赋值,那么默认值就是undefined,而不是 null
  3. 细节二:如果一个函数,没有写return,那么默认return undefined,而不是null
  4. 细节三:前端程序员习惯上,把非对象的空值写为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()

八、有时间必看JS秘密花园