仅作为学习总结笔记,随着知识的积累和技术的发展随时可能会修改
数据类型简介
- 如果想了解JS奇奇怪怪的bug 可以搜索一下JavaScript秘密花园
数字和字符串区别
- 问:都是1,为什么要分1和'1'
功能不同
-
数字和字符串完全不同,要严谨
-
数字能加减乘除,字符串不行
-
字符串能表示电话号码等,数字不行
存储形式不同
-
JS中,数字是用64位浮点数形式存储的
-
而字符串使用类似UTF-8的形式存储的(UCS-2)
如何存数字
- 十进制转二进制即可
1. 十进制转二进制
-
31 变成二进制 31 = ? × 2的五次方 + ? × 2四次方 + ? × 2三次方 + ? × 2二次方 + ? × 2一次方 + ? × 2零次方
-
经过一番尝试 得出答案: 31 = 1 × 2的五次方 + 1 × 2四次方 + 1 × 2三次方 + 1 × 2二次方 + 1 × 2一次方 + 1 × 2零次方
-
所以31(十进制)= 01111(二进制)
-
不是套公式,程序员不套公式,多尝试比较重要
2. 二进制转十进制
-
100011 变成十进制
-
每一位乘二的位数平方(从右往左数),加起来即可
-
100011= 2∧5+2∧1+2∧0 = 35
3. 用十六进制表示二进制
-
为什么用16进制?
-
因为二进制写起来太慢了:011110001011010
-
记住8 4 2 1 对应 x x x x
-
从右往左每四个数字写成一位,011=3/1100=12/0101=5/1010=10
-
得到了3,12,5,10,把大于9的数字改为A B C D E F
-
于是得到了3C5A,也可以用计算器中的程序员模式进行换算
- HEX是16进制、OCT是8进制、DEC是10进制、BIN是2进制
-
如何存字符
-
转换成数字再存,但注意'1' 不能用数字1来表示
-
如何存储a、b、c和1、2、3,简单、直接编号来表示他们就行
美国人编了个号
-
其中重要的需要记下来
-
数字0用48表示,小写a用97表示,大写A用65表示
中国人用电脑后,中文由国标局编号【国标2312】
-
刚开始只有2000多个中文和日文被收录进去,生僻字、繁体字、韩文忘了编进去
-
后来微软推出了GBK国标扩,含21886个汉子和图形符号
- 但是泰文,藏文等语言还是显示不了,于是又开始继续编,一次满足世界所有需求
unicode万国码
-
优点:已收录13万字符(大于16位),以后还会继续扩充,不会停止,全世界通用
-
缺点:两个字节不够用,每个字符需要三个或以上字节,所有文件扩大50%,不划算
解决unicode存储扩大问题
- 用unicode,但存储时偷懒
于是UTF-8被发明出来了
JS中的数据类型
简介
-
七种(大小写无所谓)
-
数字
number -
字符串
string -
布尔
bool -
符号
symbol -
空
undefined -
空
null -
对象
object
-
-
四基两空一对象
-
前六种是简单类型数据,对象是复杂类型数据
以下不是数据类型
-
数组、函数、日期等
-
它们都属于object
1、数字 number
写法
-
整数写法: 1
-
小数写法: 0.1
-
科学计数法: 1.23e4
-
八进制写法:0123或00123
-
十六进制写法:0x3F或0X3F
-
二进制写法:0B11或0b11
- 后三种用的很少,主要记住前三种
特殊值
-
正0和负0:都等于0,但是符号不同,要严谨
-
无穷大:
infinity、+ infinity、- infinity -
无法表示的数字:
NaN(Not a Number)但它是一个数字
64位浮点数
1. JS数字的存储形式
-
浮点就是浮动的点,意思就是小数点可以移动
-
123.456可以表示为1.23456e10∧2
-
也能表示为 12345.6e10∧-2
2. 64位存储一个number
-
符号占一位
-
指数占11位(-1023~1024)
-
有效数字占52位(省略掉开头的1)
3. 范围和精度
-
范围:
-
number.max_VALUE:得到最大数字 -
number.min_VALUE:得到最小数字
-
-
精度:
-
90后面15个零都可以存,但超过16个零就不行了
-
现在JS出了一个新的数据类型可以解决这个问题
bigint需要的时候搜MDN
-
2、字符串 string
- 每个字符两个字节(阉割版UTF-8)
1、写法
-
单引号:
'你好' -
双引号:
"你好" -
反引号: `你好`
2、注意
-
引号不属于字符串的一部分
-
引号内如果要包含引号,请用转义
转义
-
错误写法
-
'it's ok' -
JS引擎会以为
'it'就结束了,后面它就不管了
-
-
正确写法
-
it\'s ok'这样就是转义 -
"it's ok"或 `it's ok` 交替使用符号,可以让JS引擎知道你想表达什么
-
-
转义就是用另种写法表示你想要的东西
-
' 表示 '
-
" 表示 "
-
\n 表示 换行
-
\r 表示 回车
-
\t 表示 tab制表符
-
\ 表示 \
-
\UFFFF 表示对应的unicode字符
-
\xFF 表示前256个unicode字符
-
多行字符串
-
let s = `这样是 可以的 用反引号很容易做到` -
以前没有反引号的时候,想实现就很麻烦,双引号和单引号实现不了这种效果
-
字符串的属性
字符串长度
-
string.length'123'.length // 3
(特 别 注 意) 空格不代表没有,空字符串和空格字符串不是一个东西
通过下标读取字符
-
string[index]-
let s = 'hello' -
s[0] //h
-
-
注意
index从零开始s[0]是第一个字符
-
注意
index到length的转换-
let s = 'hello' -
s[5] // undefined -
s[4] // 'o'
-
base 64转码
-
window.btoa
- 正常字符串转为Base64编码的字符串
-
window.atob
- Base64编码转为正常字符串
-
一般用来隐藏招聘信息里的简历
-
有时候也用来给入门程序员装逼,骗一部分外行
3. 布尔值 boolean
- 只有两个值
true和false注意大小写
下列运算符会得到bool值
-
否定运算:
!value -
相等运算:
1==2、1!=2、3===4、3!==4 -
比较运算:
1>2、1<=2、3<4、3<=4
补充
-
if 配 bool,if 语句常需要判断真假
if(value){...}else{...}
-
问题
-
如果value是bool,一切正常
-
如果value不是bool,那就看是否为falsy值
-
-
falsy值
- falsy相当于false,但又不是false的值
-
五个falsy值
-
undefined -
null -
0 -
NaN -
''空字符串
-
4、undefined和null 两种空类型
-
为什么有两个空值
- 因为这时JS原创之处,对比其他语言,这就是它的垃圾之处
区别(没啥本质区别)
-
如果一个变量声明了,但没有赋值,那默认就是
undefined,不是null -
如果一个函数没写
return,那默认return是undefined,不是null -
前端程序员习惯上,把非对象空值写为
undefined,把对象空值写为null
- 但也仅仅只是习惯而已
变量声明
三种方式
-
var a = 1 -
let a = 1 -
const a = 1 -
a = 1这种是错误的声明方式,它不是声明全局变量
区别
-
var是过时的,不好用的方式,let是新的更合理的方式 -
const是声明时必须赋值,且不能再改的方式,改或者不赋值会报错 -
以后尽量都用
const和let声明变量,var有很多不合理之处 -
var等到面试前再学习,反正写代码也不用var
1. let 声明
-
规则
-
遵循块作用域,即使用范围不能超过
{} -
不能重复申明
-
可以赋值,也可以不赋值
-
必须先声明再使用,否则报错
-
全局声明的
let变量,不会变成window的属性,var就会 -
for循环配合let有奇特的效果
-
2. const 声明
-
规则
-
跟
let几乎一样 -
唯一不同是:声明时就要赋值,赋值后不能更改,所以也叫常量
-
变量声明规则
-
指定值
let a = 1a的值是1
-
同时也指定了类型
let a = 1a里值的类型是 number
-
但是指的类型可以随意变化
a = 2 和 a = '字符串'
name 和 'name'的区别
name是变量
- 值可以变,可能是
'name'可能是'hello'
'name'是字符串常量
-
常量就是不变量
-
'name'只能是'name',不能是其他值
数据类型转换
1.number => string 数字转字符串
-
String(n) -
n + ''(空字符串)这个方法是最常用的
2.string=>number 字符串转数字
-
Number(s) -
parseInt(s)或者parseFloat(s)现在不需要在s后面加10也能达到转换效果,JS引擎升级了 -
s - 0最常用的方法+ s也能变成number
3. x => bool 把任何值变成布尔
-
Boolean(x) -
!!1或!!0或!!x
4. x=>string 把任何值转成字符串
-
String(x) -
x.toString()如果x为数字那么x需要加括号,否则会报错,因为js引擎有点傻