一、前提认知
1、1和'1'的区别
- 1是数字,能加减乘除
- 2是字符串,不能加减乘除
2、各进制转化
- 十进制转二进制:31的二进制为011111
- 二进制转十进制:100011的十进制为35
- 二进制转十六进制(从右往左,每四位为8421,计数为123456789ABCDEF):011110001011010的十六进制为3C5A
- 在科学计算器中,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
- 如何存储
1.2.1、范围和精度
- 范围
- 最小(指数负方向拉满,即-1023;有效数字最小1)~最大(指数正方向拉满,即1024;有效数字拉满,即52个1)
- 即Number.MIN_VALUE(0小数点后加三百个0) ~ Number.MAX_VALUE(1后加三百个0)
- 精度
- 二进制约52+1个有效数字
- 十进制约15+1个有效数字
- 综上,即9后15个0
- 第16位如果是小于90开头,都能精确表示
- 否则,如9110000000000001,不能精确表示
2、string(每个字符两个字节)
2.1、写法
- 单引号''、双引号""、反引号``
- 引号不属于字符的一部分
- 表达it's ok,'it's ok'❌
- 需要将中间的'进行转义(用另一种方式表达),如下
、
、"it's ok",√
- 几种转义:
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极佳
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的变态用法。