- 数字与字符串
- 功能不同
- 数字是数字,字符串是字符串,要严谨
- 数字能加减乘除,字符串不行
- 字符串能表示电话号码,数字不行
- 储存形式不同
- js中,数字是用64位浮点存储的
- js中,字符串是用类似utf8形式存储的
如何存数字
十进制转二进制
二进制转十进制
用十六进制表示二进制
使用 win10 自带的计算器可以换算
如何存储 abc 123 --- 使用编号表示 用0-127表示所有符号
中国人开始用电脑--(国标2312)---有了生僻字---微软--国标扩展--简称GBK--网页里有藏文--泰文---一次性解决全球需求---万国码--unicode--优缺点,每个字符要三个及以上字节---优化--utf8--8的意思就是最少用8位存一个字符
- 存储英文字母 三字节缩成一字节,比GBK还省
- 存储中文 ,还是三个字节
数字1和字符1的区别
- 数字通过二进制直接存
- 字符通过编码形式存储
js的数据类型
- 7种大小写无所谓
- 数字 number
- 字符串 string
- 布尔 bool ---布尔值--ture--false
- 符号 symbol
- 空 undefined
- 空 null
- 对象 object
- 总结:数字不符,两空一对象
- 以下不是数据类型
- 数组,函数,日期
- 它们都属于object
布尔 ture 和 false
下列运算符会得到bool值
- 否定运算
- !value (某些值前加上!号表示取反)
- 相等运算
- 1==2 ,1 !=2 ,3 ===4, !==4
- 比较运算
- 1>2 , 1>=2 ,3<4 ,3<=4
if配 bool
- if 语句常常需要判断真假
- if(value){...}else{...}
- 问题
- 如果value不是bool值怎么办?怎么判断真假
- 1是真还是假,0是真还是假
- '1'是真还是假.'0是真还事假'
五个falsy 值---falsy 就是相当于false但又不是false的值
分别是 undefined null 0 NaN ''
数字 number (64位浮点数)
- 整数写法
- 1
- 小数写法
- 0.1
- 科学计数法
- 1.2e4
- 八进制写法(用的少)
- 0123或00123或0o123
- 十六进制写法
- 0x3F 或 0X3F
- 二进制写法
- 0b11或0B11
特殊值
正0 和 负0
+0 === -0
1/0
Infinity
1/+0
Infinity
1/-0
-Infinity //负无穷
- 无穷大
- Infinity +infinity -infinity
- 无法表示的数字
- NaN (Not a Number)
- 但它是一个数字(讲一下历史)
0/0
NaN
NaN === NaN
false
64位浮点数
- js数字的储存形式
- 浮点就是浮动的点意思是小数点会乱动
- 123.456可以表示为 1.23456e10^2
- 也可以表示12345.6e10^-2
64位储存一个number
- 符号占1位
- 指数占11位(-1023~1024)
- 有效数字占52位(开头的1省略)
范围和精度
Number,Max_VALUE
1.7976931948623157e+308
- 指数拉满,有效数字拉满,得到最大二进制数字
- 指数负 方向拉满,有效数字最小1,得到最小值
Number.MIN_VALUE
5e-324
- 范围和精度
- 最多只能到52+1个二进制位表示有效数字
- 2^53对应的十进制是9后面15个零
- 所以15位有效数字都能精确表示
- 16位有效数字如果小于90开头,也能精确表示
- 911000000000000001就存不下来
字符串string
每个字符两个字节(阉割版UTF8)
写法
- 单引号
- '你好'
- 双引号
- "你好"
- 反引号
- `你好`
- 注意
- 引号不属于字符串的一部分,就像书名号不属于书名的一部分一样
- 如果要在单引号里面包含单引号怎么办?
转义
- 错误写法
- 'it's ok'
- JS引擎会认为'it'就结束了,后面看不懂
- 正确写法
- 'it's ok'
- "it'ok" ---单引号和双引号交替使用
- 用另一种写法表示你想要的东西
- '表示'
- "表示"
- n 表示换行
- r表示回车
- t表示tab制表符
- 表示
- uFFFF表示对应的Unicode字符
- xFF表示前256个Unicode字符
多行字符串
- 如果你想要在字符串里回车
let s = `这样是
可以的
用反引号很容易做到`
- 以前没有反引号的时候
- 写起来很麻烦可以看网道教程
字符串的属性
比较特殊,只有对象才有属性,这个是魔法
string.length
'123'.length //3
'nrt'.length // ?
''.length // 0 (空)
' '.length // 1 (空格)
'//'.length // 3
通过下标读取字符
- string[index]
- let s ='hello'
- s[0] // "h"
- 注意index从0开始
- let s = 'hello'
- s[5] // undefined,居然不报错
- s[4] // '0'
base64 转码
- window.btoa
- 正常字符串转为Base64 编码的字符串
- window.atob
- base64 编码的字符串转为原来的字符串
- 一般用来隐藏招聘启事里的邮箱
- 有时候也有用来自欺欺人
变量声名
- 三种变量声名方式
- var a =1
- let a = 1
- const a =1
- a = 1 有时候是声明全局变量,有时候是赋值
- 区别
- var是过时的,不好用的方式
- let 是新的,更合理的方式 (变量声明)
- const 是声名必须赋值,且不能再改的方式 (常量声明)
- 最后这种方式是错误的,不准这样声名
- var 变量提升(后面)
- 我们写代码从不用var
- let 声明
- 规则
- 遵循块左右域,即使使用范围不超过{}
{
let b = 1
console.log(b)
}
1
console.log(b)
报错
- 不能重复申明
- 可以赋值,也可以不赋值
let a
a
undefined
- 必须先声明再使用,否则报错
- 全局申明的let变量,不会变成window的属性
var abc = 'abc'
undefined
window.abc
'abc'
这个是bug
- for循环配合let有奇效
- 满足新人幻想
for(let i=0;i<5;i++)
setTimeout(()=>console.log(i),0)
0
1
2
3
4
const 声明
- 规则
- 跟let几乎一样
- 只有一条不一样,声明时要赋值,赋值后不能改 (有且仅有一次赋值)
const i =100
undefined
i = 101
报错
变量声名
- 指定值
- var a =1
- 同时也指定了类型
- var a =1
- 但是值和类型都可以随意变化
- a=2
- a='字符串'
name 和 'name'区别
name是变量
- 值可以变可能是'name',可可能是'hello'
'name'是字符串常量
- 常量就是不变量
- 'name'只能是'name',不能是其他值
object 复杂类型
类型转换
- number =>string
- 用大写的String() 是函数
- 用 n+'' n加空字符串
var n =1
undefined
String(n)
"1"
- string 变 Number
- s - 0
- +s
var s = '123'
undefined
Number(s)
123
s-0
123
x => bool
- boolean(x)
- !!x
boolean(1)
true
!!1
ture
- x=>string
- String(x)
- x.toString
ture.toString()
"true"