数字与字符串
功能不同:
- 数字能加减乘 字符串只能加
- 字符串表示手机号码,数字不行,0开头没有意义
存储方式不同
- js中,数字是转成2进制即64位浮点数形式存
- js中,字符串经过编码再转换成数字存储的
如何存数字
数字以0/1存,所以转二进制
- 10转2:31=?*2……
- 2转10:=2的n次方
16进制转2进制:1-9 A-F
- 以8 4 2 1表示xxxx
- 把二进制数对应四个四个一份,大于9转换成数字
Tips:也可用程序员计算器
如何存字符
- 0~127表示所有字符:其中‘0’表示48,48-57表示数字符号,65表示A,97表示a
- 【GB2312】:为汉字用,一个16进制数表示4位,4个就是16位,2个字节,包含2^16个字符
- 【微软GBK】:生僻字、繁体字、韩文,国标扩,含2万多个,兼容GB2312,16位,后来国家发布新的国标库,但是不兼容GB2312未被广泛使用
- 【万国码Unicode】:藏文、泰文,包含3万多个字符,字节大于2个,大于2^16,占硬盘
- 【UTF-8】:开头1110表示这个字符3个8位,于是再读两个8位信息,开头各为10表示位数,然后合起来,前面补0,再读,开头为0说明只占8位,问开头的那个人比如餐厅
- UTF-8 是 Unicode 一种存储规则,也叫字符编码规则
Tips:以8位起,英文一个字节,中文3个字节
js的数据类型
分类:四基二空一对象
不区分大小写
number、string、bool、symbol、underfined、null、obeject
注意:函数、数组、日期都是对象
number类型
整数、小数、科学计数法、十六进制0X或0x开头、八进制0或00或0o开头、二进制0b或0B开头
JS 的 number 全都是以小数(浮点数)的形式存储的,没有单独的整数
number特殊值
- 0分3种:正负0,0,但是
2/0
Infinity
2/+0
Infinity
2/-0
-Infinity
- 无穷大
infinity,+infinity,-infinity
- NaN是一个数字 表示不知道的数字,知识受限制;
NaN !==NaN
例如0/0 0?1?
数学的历史:正数,0,负数,分数(有理数),无理数Π,虚数i^2=-1复数
64位浮点数
- 小数点可以移动的数
- 符号0表示正数,1表示负数,
- 指数部分为2^11,由于含正负,所以减半,范围为-1023~1024;
- 有效数字的首位都不是0,由于10进制首个可为1~9,二进制发现首位可为1,所以省掉第一个1
0.5怎么存
先转成二进制数,1*2-1得0.1,为2-1,所以存储为0 -1 0
0.625怎么存
转成二进制数,得0.101,转成科学计数法,所以存储为0 -1 01
64位浮点数的范围和精度
范围
最大:指数拉满2^1024,有效数字拉满(全为1),得最大二进制数
Number.MAX_VALUE
1.7976931348623157e+308
最小:指数负的最大2^-1023,有效数字(全为1),得最小二进制数
Number.MIN_VALUE
5e-324
精度:有效数字
- 最多52+1个有效数字
- 2^53有效数字是对应十进制数:9开头的15位数
- 所以最大为十进制15-16位有效数字,约为53位的二进制有效数字
- 16位的有效数字,小于90开头的可精确显示
- 所以900000000000001的0不会显示
字符串string
2个字节
写法:单,双,反引号``
引号不属于字符串
转义\
'it\'s \"ok\"'
"it's "ok""
`it's "ok"`
"it's "ok""
单双引号交替使用,反引号万能
'1\n2'
"1
2"
'1\r2'
"1
2"
'1\t2'
"1 2"
'\uFFFF'
""
'\x31'
"1"
\n表示换行
\r表示回车
\t表示制表位
双\表单\
\uffff表示unicode字符
\xff表示256个Unicode字符 例如\x31表示1 10进制的49成31
多行字符串
里面回车
let s=`大家好
嘻嘻
哈哈`
字符串属性
对象才有属性的
字符串长度.length
空字符串和空格字符串不同,为0和1
'123'.length
3
'\n\r\t'.length
3
'\\\\\\'.length
3
''.length
0
' '.length
1
通过下标读取字符串 string[index]
index是0开始,length-1结束
let s='hello'
undefined
s[0]
"h"
s[5]
undefined
base64转码
编码btoa和反编码atob
window.btoa('1152827086@qq.com')
"MTQyOTQ4MzE1M0BxcS5jb20="
window.atob('MTQyOTQ4MzE1M0BxcS5jb20=')
"1152827086@qq.com"
bool的5个falsy值
if(value){…}else{…}
value为bool值还好,不是呢怎么判断真假
flasy值是相当于false,但不是false值
五个:underfined null 0 NaN ''空字符串 false
只有这几个false值,空字符串和空格字符串不是一个
underfined和null
无本质区别
区别在于:
- underfined是声明未赋值的变量的默认值
- 函数返回值return未写时,默认return underfined
- 习惯上,非对象为空写成underfined,对象是null
symbol符号
Symbol 生成一个全局唯一的值
变量声明三种
var a=1
let a=1 //变量声明
const a=1 //常量声明
a=1 //赋值,不是声明
function f1(){
let a=1;
function f2(){
a=2;}
f2();}
undefined
f2()
VM236:1 Uncaught ReferenceError: f2 is not defined
at <anonymous>:1:1
以后只能用let
let声明
- 只作用于代码块,不超出{}
{
let a=1;
}
console.log(a);
- 不能重复声明 在同一个作用域
let a=2;
{
let a=4;
}
//正确
- 声明时可以赋值,可以不赋值
- 先声明在使用
- 全局声明的let,不会成为window的属性
var会,例如window.abc - for循环配合奇效
for(let a=1;a<5;a++){
setTimeout(()=>{console.log(a)
},0)}
//返回1 2 3 4
//var是显示4个5
const声明
- 其他和let一样
- 但不和for循环配合
- 声明时要赋值,且不可更改
变量声明
- 声明指定了值和类型
- 后期可随意变化
- 区别name和‘name’:
前者是变量,存在不知道什么区,值和类型可变
后者是常量字符串,存在堆中
类型转换
number=>string String()
123+’’ 空字符串
js Bug:String(1…20个0…)会转换成科学计数法"1e+22"
string=>number Number()
‘abc’-0
+‘abc’
preseInt(s)/preseFloat(s)
x=>bool
Boolean()
!!x //取原始布尔值,如!!1
!1
false
!!1
true
x=>string
x.toString()
true.toString()
"true"