JS 数据类型

289 阅读4分钟

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符号

JS 中的 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/…