文章目录
数字与字符串
-
功能不同:
数字能加减乘 字符串只能加字符串表示手机号码,数字不行,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转换成数字
也可用程序员计算器
如何存字符
-
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 一种存储规则,也叫字符编码规则
以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('1429483153@qq.com')
"MTQyOTQ4MzE1M0BxcS5jb20="
window.atob('MTQyOTQ4MzE1M0BxcS5jb20=')
"1429483153@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"
特例:
1.toString报错
1 .toString
1…toString
(1).toString
1..toString()
"1"
都正确
《js 秘密花园》
讲述js各种奇葩之处