【JS】JS的数据类型

255 阅读4分钟

数据类型

  • 数值 number :整数和小数(比如1和3.14)
  • 字符串 string : 文本(比如Hello World)
  • 布尔 bool :只有两个值,true 和 false,注意大小写
  • 符号 symbol
  • 空 undefined :表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • 空 null :表示空值,即此处的值为空
  • 对象 object : 各种值组成的集合
总结:四基两空一对象
注:数组、函数、日期属于特殊的对象

一、数值(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)

每个字符两个字节

写法:

'你好'//单引号
"你好"//双引号
`你好`//反引号

如果想在字符串里回车,那么可以直接用反引号

let s = `这样是
可以的
用反引号很容易做到`
注意:引号不属于字符串的一部分,就像书名号不属于书名的一部分一样

转义

\'表示'

\"表示"

\n表示换行

\r表示回车

\t表示tab制表符

\ \表示\

\uFFFF表示对应的Unicode字符

\xFF表示前256个Unicode字符

字符串的属性

字符串不该有属性!只有对象才有属性(原因之后再说)

字符串的长度string.length

'123' . length // 3
'\n\r\t' .length // 3
''.length // 0 空字符串
' '.length // 1 里面有个空格,不是空字符串

通过下标读取字符string[index]

let S = 'hello';
s[0] // "h"

注意index从0开始,s[0]是第一个字符,最后一个字符应该是length-1

let s = 'hello';
s[5] // undefined,居然不报错
s[4]// 'o'

三、布尔(bool)

只有两个值,true和false

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

  • 前置逻辑运算符: ! (Not)
  • 相等运算符:===!====!=
  • 比较运算符:>>=<<=

如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true

  • undefined
  • null
  • false
  • 0
  • NaN
  • ""''(空字符串)

四、undefined和null

  • null与undefined都可以表示“没有”,没有本质区别
  • 细节一:如果一个变量声明了,但没有赋值,那么默认值就是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()

参考资料

内容参考 JavaScript 教程

有时间必看 JS秘密花园