JS数据类型

311 阅读4分钟

一、前提认知

1、1和'1'的区别

  • 1是数字,能加减乘除
  • 2是字符串,不能加减乘除

2、各进制转化

  • 十进制转二进制:31的二进制为011111 微信图片_20230304233634.png
  • 二进制转十进制:100011的十进制为35 微信图片_20230304234047.png
  • 二进制转十六进制(从右往左,每四位为8421,计数为123456789ABCDEF):011110001011010的十六进制为3C5A 微信图片_20230304234531.jpg
  • 在科学计算器中,BIN是二进制;OCT是八进制;DEC是十进制;HEX是十六进制

3、如何存字符

  • 都给它们编号,用0-127表示所有符号
  • eg:48表示0;65表示A;97表示a

4、如何存汉字

  • 也是编号,【国标2312】,用0000-FFFF表示
  • 但无法表示生僻字、繁体字等,微软推出国标扩展,【GBK】
  • 但无法表示藏文、泰文等,推出Unicode,【万国码】
  • 但Unicode存储太大了,要三个十六进制字节,发明【UTF-8】(这个逻辑是看首位1来确定后面有几位是一起的),最少可用8位存一个字符

5、计算机是通过文件后缀等来区分是数字还是字符串

二、七个JS数据类型

四基两空一对象:数字number、字符串string、布尔bool、符号symbol、空undefined、空null、对象object

1、number

1.1、写法
  • 整数、小数、科学计数法、八进制、十六进制、二进制
  • 特殊:+0、0、-0不一样;Infinity无穷大、+Infinity正无穷大、-Infinity负无穷大
  • 无法表示的数字是NaN(Not a Number),但它是一个数字,判断NaN==NaN,false
1.2、64位浮点数
  • 小数点可以浮动
  • eg:123.456可以表示为1.23456e10^2、12345.6e10^-2
  • 如何存储 微信图片_20230305002828.jpg
1.2.1、范围和精度
  1. 范围
  • 最小(指数负方向拉满,即-1023;有效数字最小1)~最大(指数正方向拉满,即1024;有效数字拉满,即52个1)
  • 即Number.MIN_VALUE(0小数点后加三百个0) ~ Number.MAX_VALUE(1后加三百个0)
  1. 精度
  • 二进制约52+1个有效数字
  • 十进制约15+1个有效数字
  • 综上,即9后15个0
  • 第16位如果是小于90开头,都能精确表示
  • 否则,如9110000000000001,不能精确表示

2、string(每个字符两个字节)

2.1、写法
  • 单引号''、双引号""、反引号``
  • 引号不属于字符的一部分
  • 表达it's ok,'it's ok'❌
  • 需要将中间的'进行转义(用另一种方式表达),如下
  • 微信图片_20230305113523.png微信图片_20230305113720.png 、"it's ok",√
  • 几种转义: 微信图片_20230305114152.jpg
2.2、字符串属性
  • 该知识点待更新
2.3、字符串长度
  • string.length
  • '123'.length——3、'\n\t\r'.length——3、''.length——0、' '.length——1
2.4、下标读取字符
  • 第一位是0,最后一位是长度-1
2.5、base64转码
  • window.btoa,转码为base64
  • window.atob,转码为原来

3、bool

  • 布尔值,true/false,!==、==、===、!===、<、>等可得布尔值
  • 五个falsy值:undefined、null、0、NaN、''
  • 整个JS只有6个假值,其余为真
  • eg:1真、0假、'1'真、'0'真、''假

4、symbol,很不常用

5、undefined、null,两种空类型

  • undefined更多的是默认的空,null是主动的空
  • eg:一个变量,声明了未赋值,默认undefined;一个函数,没有写return,默认return undefined
  • 习惯上,非对象空值为undefined,对象空值为null

三、变量声明

1、声明方式

  • var a=1,过时,不好用
  • let a=1,新的,更合理的
  • const a=1,声明时必须赋值,且不能再改
  • 一般const是常量声明,let是变量声明
1.1、let
  • 快作用域,使用范围不能超过{}
  • 不能重复声明
  • 可以赋值/不赋值
  • 先声明再使用
  • 全局声明的let,不会变成window属性
  • for配合let极佳 微信图片_20230305123932.png
1.2、const
  • 与let几乎一样,但声明时就要赋值且不能再改
1.3、name和'name'的区别
  • name是变量,值可变
  • 'name'是字符串常量,值不可变

2、变量声明时既指定了值也指定了类型

3、类型转化

  • number——>string,String(a)/a+''/''+a。小bug:当a有很多0时,如20个左右,转成的字符串变成了科学计数法
  • string——>number,Number(b)/parseInt(b)/parseFloat(b)/b-0/+b
  • c——>bool,Boolean(c)/!!c
  • d——>string,String(d)/d.toString()

四、结语

  • JS秘密花园,有非常规的JS的变态用法。